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:
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:
VBS-Code zur Umsetzung:
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
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