[VBS] Zeilen anhand eines Spalteneintrags x-fach duplizieren

[VBS] Zeilen anhand eines Spalteneintrags x-fach duplizieren

Einzelne Zeilen einer Textdatei (z.B. test.csv) sollen x-fach dupliziert werden, wobei die Anzahl der Wiederholungen in einer Spalte der Zeilen steht.

Exemplarischer Inhalt der CSV-Datei:
Code:
KD;Name;Anzahl;wiederholung
123;Thomas;5;11
456;Sandra;3;7
789;Klaus;9;1

Wenn die Spalte "Anzahl" angibt wie oft die Zeile geschrieben werden soll wäre das zu erwartende Ergebnis der geänderten CSV-Datei wie folgt:
Code:
KD;Name;Anzahl;wiederholung
123;Thomas;5;11
123;Thomas;5;11
123;Thomas;5;11
123;Thomas;5;11
123;Thomas;5;11
456;Sandra;3;7
456;Sandra;3;7
456;Sandra;3;7
789;Klaus;9;1
789;Klaus;9;1
789;Klaus;9;1
789;Klaus;9;1
789;Klaus;9;1
789;Klaus;9;1
789;Klaus;9;1
789;Klaus;9;1
789;Klaus;9;1

VBS-Code zur Umsetzung:
Visual Basic:
dim fso
set fso = CreateObject("Scripting.FileSystemObject")

Const ForReading = 1
Const ForWriting = 2

dim hauptpfad
dim eingangsdatei
dim trennzeichen
dim spaltenauswahl
dim ausgangsdatei

' "C:\VBS\" durch eigenes Verzeichnis ersetzen. In diesem Verzeichnis befindet sich die zu bearbeitende CSV-Datei
hauptpfad = "C:\VBS\"

' "test.csv" durch eigenen Dateinamen ersetzen
eingangsdatei = hauptpfad & "test.csv"

' falls die Textdatei ein anderes Trennzeichen verwendet (z.B. ein Komma) kann dies hier eingestellt werden
trennzeichen = ";"

' "Anzahl" durch eigenen Spaltennamen ersetzen (den Spaltennamen eintragen der die Anzahl der Wiederholungen einer Zeile vorgibt)
spaltenauswahl = "Anzahl"

' "datendatei_neu.csv" durch eigenen Dateinamen ersetzen, falls gewünscht
ausgangsdatei = hauptpfad & "datendatei_neu.csv"

dim eingabe, ausgabe
dim zeile, inhalt, teilen
dim i, d, spaltennr, j

'Original-Datendatei  zum Lesen öffnen
set eingabe = fso.OpenTextFile(eingangsdatei, ForReading)

'Neue Datendatei erstellen und zum Schreiben öffnen
set ausgabe = fso.OpenTextFile(ausgangsdatei, ForWriting, True)

'Textdatei zeilenweise einlesen
Do while not eingabe.AtEndOfStream

    'Aktuelle Zeilennummer ermitteln
    zeile = eingabe.Line

    'Zeile einlesen
    inhalt = eingabe.ReadLine

    'Zeile in Array splitten anhand vorgegebenem Trennzeichen
    teilen = split(inhalt, trennzeichen)

    'Länge des Arrays (Anzahl der Einträge im Array) ermitteln und in Variable speichern
    d = UBound(teilen)

    'durch Array (alle Spalten aktueller Zeile) iterieren (von 0 bis Ende des Arrays)
    for i=0 to d
        'nur bei Zeile 1 ausführen
        if ( zeile = 1 ) then
            'wenn Array-Spalte den Suchbegriff beinhaltet...
            if ( teilen(i) = spaltenauswahl ) then
                'aktuelle Array-Nr (Spaltennr) speichern
                spaltennr = i
            end if
        end if
    next

    'bei Zeile 1 die komplette Zeile in die neue Textdatei schreiben
    if ( zeile = 1 ) then
        ausgabe.WriteLine inhalt
    'alle anderen Zeilen x-Fach in die neue Datei schreiben (so oft wie es die oben gesuchte Spalte angibt)
    else
        'Ausgabe x-Fach wiederholen
        for j=1 to teilen(spaltennr)
            ausgabe.WriteLine inhalt
        next
    end if
Loop

eingabe.Close
ausgabe.Close

'Originaldatei löschen
fso.DeleteFile(eingangsdatei)

'Neue Textdatei umbenennen (mit Namen der gelöschten Originaldatei)
fso.MoveFile ausgangsdatei, eingangsdatei

Nachdem der Code recht detailliert kommentiert ist (alle grün dargestellten Zeilen sind Kommentare zum jeweils folgenden Code) sollte eine zusätzliche Erklärung nicht notwendig sein.

Viele Grüße
Tom
Autor
rince1984
Aufrufe
2.467
First release
Last update
Bewertung
0,00 Stern(e) 0 Bewertungen
Zurück