CSV-Datei Spalten per Batch auf 0 setzen
Hallo zusammen,
Ich habe etwa 2500 CSV-Dateien in einem Ordner mit folgendem Aufbau:
Zeile 1: 10008368;8793;0;13.03.2009;;;;;;LAGER;KA;NH;S/A;0022,0;0100,0;01,200;547;;13.03.2009;12:23:41;;;;
Zeile 2: 10008369;8793;0;13.03.2009;;;;;;LAGER;KA;NH;S/A;0022,0;0100,0;01,200;547;;13.03.2009;12:23:41;;;;
Zeile 3: ....
Das Erzeugerprogramm hat die Daten leider falsch erzeugt, ich kann mir aber weiterhelfen wenn ich per Batchbefehl folgende Änderungen in allen Dateien vornehme:
1. die zweite Spalte soll den Wert 0 erhalten (statt hier wie im Beispiel die 8793)
2. die Spalte mit "KA" (variable Textwerte) soll den Wert "SSH" erhalten
Kann mir jemand weiterhelfen, wie man das angeht?
Danke im voraus!
Gruß
elfatalegre
Ich habe etwa 2500 CSV-Dateien in einem Ordner mit folgendem Aufbau:
Zeile 1: 10008368;8793;0;13.03.2009;;;;;;LAGER;KA;NH;S/A;0022,0;0100,0;01,200;547;;13.03.2009;12:23:41;;;;
Zeile 2: 10008369;8793;0;13.03.2009;;;;;;LAGER;KA;NH;S/A;0022,0;0100,0;01,200;547;;13.03.2009;12:23:41;;;;
Zeile 3: ....
Das Erzeugerprogramm hat die Daten leider falsch erzeugt, ich kann mir aber weiterhelfen wenn ich per Batchbefehl folgende Änderungen in allen Dateien vornehme:
1. die zweite Spalte soll den Wert 0 erhalten (statt hier wie im Beispiel die 8793)
2. die Spalte mit "KA" (variable Textwerte) soll den Wert "SSH" erhalten
Kann mir jemand weiterhelfen, wie man das angeht?
Danke im voraus!
Gruß
elfatalegre
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 111872
Url: https://administrator.de/contentid/111872
Ausgedruckt am: 26.11.2024 um 06:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo,
ist das eine einmalige Angelegenheit oder kommt das öfter vor?
Sind die zu ändernden Spalten 2 und 11, so wie in den Zeilen oben?
Ist der Dateipfad konstant. Wenn ja bitte angeben?
Gruß Dieter
ist das eine einmalige Angelegenheit oder kommt das öfter vor?
Sind die zu ändernden Spalten 2 und 11, so wie in den Zeilen oben?
Ist der Dateipfad konstant. Wenn ja bitte angeben?
Gruß Dieter
Hallo,
danke für die schnelle Antwort.
Du kannst auch den Originalpfad verwenden, weil ich die Exportdateien in einen Unterordner schreibe. Das macht es einfacher d.h. aus dem Original-Ordner lesen
und in den Unter-Ordner neu schreiben.
Gruß Dieter
PS. Gibt es Leerzeilen mit ";;;"
danke für die schnelle Antwort.
Du kannst auch den Originalpfad verwenden, weil ich die Exportdateien in einen Unterordner schreibe. Das macht es einfacher d.h. aus dem Original-Ordner lesen
und in den Unter-Ordner neu schreiben.
Gruß Dieter
PS. Gibt es Leerzeilen mit ";;;"
Moin elfatalegre,
willkommen im Forum.
Wir hatten Varianten dieses Themas schon ein- oder zweimal hier durchdekliniert und eine (typische) Lösung findest Du z.B. in diesem Thread Steuerzeichen per vbs aus txt-Datei entfernen oder auch über eine Forumssuche nach "ReadAll".
Idee (auch bei vielen anderen Lösungen) war:
---> wenn allerdings in der 2.Spalte (also die mit Beispielwert 8793) je Datei oder gar innerhalb einer Datei unterschiedliche Werte stehen, dann müssen wir eben die "Feldliste" auch als Liste behandeln - aber auch das geht mit VBS schneller.
Deshalb Klärungsfrage: Stehen in "Spalte2" je Datei (oder noch öfter) unterschiedliche Werte oder immer "8793"?
Grüße
Biber
willkommen im Forum.
Wir hatten Varianten dieses Themas schon ein- oder zweimal hier durchdekliniert und eine (typische) Lösung findest Du z.B. in diesem Thread Steuerzeichen per vbs aus txt-Datei entfernen oder auch über eine Forumssuche nach "ReadAll".
Idee (auch bei vielen anderen Lösungen) war:
- "nur" Batch ist erstens ein bisschen langsam
- aber auch grundsätzlich ist es vom Algorithmus her ein bisschen langsam, zeilenweise vorzugehen und diese Zeile wiederum in Felder/Tokens zu zerbröseln, einzelne Werte zu ersetzen und danach wieder aus vielen Feldern eine Zeile und aus vielen Zeilen eine Textdatei und aus vielen Dateien eine Genausoviel-Dateien-Fast-Kopie zeilenweise zu schreiben...
- außerdem erfordern die leeren Felder ";;;;;" zumindest im Batch eine Sonderlocke ... einfacher wäre es, wenn NULL-Felder mit "NULL" oder "" oder whatever kenntlich wären
- deshalb -> WENN ES DIE DATENINHALTE ERLAUBEN: lieber die ganze Datei als einen Klumpen auf- und anfassen und in diesem Klumpen alle ";KA;" durch ";SSH;" mit ReplaceAll() ersetzen und alle ";8793;" durch ";0;".
---> wenn allerdings in der 2.Spalte (also die mit Beispielwert 8793) je Datei oder gar innerhalb einer Datei unterschiedliche Werte stehen, dann müssen wir eben die "Feldliste" auch als Liste behandeln - aber auch das geht mit VBS schneller.
Deshalb Klärungsfrage: Stehen in "Spalte2" je Datei (oder noch öfter) unterschiedliche Werte oder immer "8793"?
Grüße
Biber
Hallo Gregor und Biber,
Biber hat recht. Mit 2500 Dateien kann das eine Weile dauern.
Da es aber kein Dauerzustand ist, reicht das wohl behelfsmäßig aus.
Getestet habe ich 10 Csv-Dateien a 65536 Zeilen.
Das sind ca. 50 MB und gedauert hat' es etwa 30 Sekunden.
Beim Starten des Scripts wird eine Eingabebox mit der Pfadabfrage angezeigt.
Es werden nur CSV-Dateien im angegeben Pfad eingelesen und bleiben auch
unverändert. Die konvertierten Dateien werden in den Sub-Ordner ...\Export
geschrieben. Und am Ende wird eine Meldung "Anzahl Dateien..." ausgegeben.
Gruß Dieter
Biber hat recht. Mit 2500 Dateien kann das eine Weile dauern.
Da es aber kein Dauerzustand ist, reicht das wohl behelfsmäßig aus.
Getestet habe ich 10 Csv-Dateien a 65536 Zeilen.
Das sind ca. 50 MB und gedauert hat' es etwa 30 Sekunden.
Beim Starten des Scripts wird eine Eingabebox mit der Pfadabfrage angezeigt.
Es werden nur CSV-Dateien im angegeben Pfad eingelesen und bleiben auch
unverändert. Die konvertierten Dateien werden in den Sub-Ordner ...\Export
geschrieben. Und am Ende wird eine Meldung "Anzahl Dateien..." ausgegeben.
Dateiname = ConvertCvs.Vbs
Option Explicit
Dim Fso, cPath, cFolder, cFile, cName, cFound, sFolder, sFile, i, s
Set Fso = CreateObject("Scripting.FileSystemObject")
cPath = InputBox("Bitte Pfad mit den Csv-Dateien eingeben.", _
"Csv-Dateien konvertieren")
If cPath = "" Then Wscript.Quit
Set cFolder = Fso.GetFolder(Fso.GetAbsolutePathName(cPath))
sFolder = cFolder.Path & "\export"
If Not Fso.FolderExists(sFolder) Then Call Fso.CreateFolder(sFolder)
For Each cFound In cFolder.Files
If LCase(Fso.GetExtensionName(cFound.Name)) = "csv" Then
i = i + 1
Set cFile = Fso.OpenTextFile(cFound.Path)
Set sFile = Fso.CreateTextFile(sFolder & "\" & cFound.Name)
Do Until cFile.AtEndOfStream
s = Split(cFile.ReadLine, ";")
If UBound(s) >= 10 Then _
s(1) = 0: s(10) = "SSH": sFile.WriteLine Join(s, ";")
Loop
cFile.Close
sFile.Close
End If
Next
MsgBox "Es wurden " & i & " Csv-Dateien gefunden und konvertiert.", , "Hinweis"
Wscript.Quit
Gruß Dieter
Hallo lemmi222,
dann schlage ich vor, Du schreibst ein awk-Code für Gregor.
Gruß Dieter
dann schlage ich vor, Du schreibst ein awk-Code für Gregor.
Gruß Dieter
Hallo Gregor,
freut mich das es geklappt hat.
Gruß Dieter
freut mich das es geklappt hat.
Gruß Dieter