CSV per Batch umschreiben
Hallo,
kann mir ev. jemand bei folgendem Problem helfen?
ich habe in einem Ordner mehrere *.csv. Ganz normal mit ; getrennt. Jede Datei beginnt mit 2 Zeilen, die ich ignorieren muss.
Hier ein paar Beispielzeilen:
Zeile1 (nicht verändern, aber "mitnehmen")
Zeile2 (nicht verändern, aber "mitnehmen")
24779;00;120000;9401812;;0203;275003;130;;;;irgendwelcher Text 091424;;;EUR;;;
-534;00;622500;9300538;;0203;275003;131;;;;bissel Text {294};;;EUR;;;
In jeder vorhandenen *.csv soll ab der dritten Zeile für jede Zeile folgendes gemacht werden:
- Suche im 12.Feld (das mit irgendwelcher Text + Leerzeichen + 6stellige Zahl) die letzten 6 Zeichen. Wenn das 6 Zahlen sind schreibe diese in das 9. Feld derselben Zeile, sonst lass es.
- Speichere das Ergebnis unter demselben Dateinamen.
Das Ergebnis müsste also dann so aussehen:
Zeile1
Zeile2
24779;00;120000;9401812;;0203;275003;130;091424;;;irgendwelcher Text 091424;;;EUR;;;
-534;00;622500;9300538;;0203;275003;131;;;;bissel Text {294};;;EUR;;;
Das Ganze soll unter WinXP funktionieren, wenn es mit Bordmitteln nicht geht kann ich auch SED oder ähnliches installieren.
ich glaube dafür reicht mein Shell-Wissen nicht mehr aus...
Hat jemand eine Idee?
Danke schonmal.
kann mir ev. jemand bei folgendem Problem helfen?
ich habe in einem Ordner mehrere *.csv. Ganz normal mit ; getrennt. Jede Datei beginnt mit 2 Zeilen, die ich ignorieren muss.
Hier ein paar Beispielzeilen:
Zeile1 (nicht verändern, aber "mitnehmen")
Zeile2 (nicht verändern, aber "mitnehmen")
24779;00;120000;9401812;;0203;275003;130;;;;irgendwelcher Text 091424;;;EUR;;;
-534;00;622500;9300538;;0203;275003;131;;;;bissel Text {294};;;EUR;;;
In jeder vorhandenen *.csv soll ab der dritten Zeile für jede Zeile folgendes gemacht werden:
- Suche im 12.Feld (das mit irgendwelcher Text + Leerzeichen + 6stellige Zahl) die letzten 6 Zeichen. Wenn das 6 Zahlen sind schreibe diese in das 9. Feld derselben Zeile, sonst lass es.
- Speichere das Ergebnis unter demselben Dateinamen.
Das Ergebnis müsste also dann so aussehen:
Zeile1
Zeile2
24779;00;120000;9401812;;0203;275003;130;091424;;;irgendwelcher Text 091424;;;EUR;;;
-534;00;622500;9300538;;0203;275003;131;;;;bissel Text {294};;;EUR;;;
Das Ganze soll unter WinXP funktionieren, wenn es mit Bordmitteln nicht geht kann ich auch SED oder ähnliches installieren.
ich glaube dafür reicht mein Shell-Wissen nicht mehr aus...
Hat jemand eine Idee?
Danke schonmal.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 110418
Url: https://administrator.de/contentid/110418
Ausgedruckt am: 20.11.2024 um 11:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo kami202 und willkommen im Forum!
Mit Batch alleine wäre es etwas mühsam, daher bietet es sich an, etwas Unterstützung durch ein integriertes VBScript zu verwenden:
Bitte beachten: Bei der Angabe des Ordners, in welchem die CSV-Dateien liegen (Zeile 2), immer am Ende des Pfades einen "\" schreiben.
Die Informationen über die Anzahl der zu überspringenden Zeilen, die Feldnummern 12 und 9 sowie die Zeichenanzahl (6) am Ende des Feldes 12 sind im Script "hart codiert" (wobei die Zählung der Feldnummern bei 0 beginnt und daher die um 1 verminderten Werte angegeben werden müssen). Das Script ist übrigens nach dem ersten Durchlauf unter "%temp%\ModifyCSV.vbs" zu finden.
Da die Zeilen "in den Dateien" (ohne Sicherungskopie) verändert werden, bitte Vorsicht beim Testen!
Grüße
bastla
Mit Batch alleine wäre es etwas mühsam, daher bietet es sich an, etwas Unterstützung durch ein integriertes VBScript zu verwenden:
@echo off & setlocal
set "Basis=D:\CSV-Dateien\"
set "Maske=*.csv"
set "Trenn=;"
set M=%temp%\ModifyCSV.vbs
> %M% echo Set fso=CreateObject("Scripting.FileSystemObject"):D=WScript.Arguments(0):T=Split(fso.OpenTextFile(D).ReadAll,vbCrLf)
>>%M% echo W=False:For i=2 To UBound(T):F=Split(T(i),"%Trenn%"):Z=Right(F(11),6):If Len(Z)=6 Then
>>%M% echo OK=1:For j=1 To 6:OK=OK*(Mid(Z,j,1)^>="0")*(Mid(Z,j,1)^<="9"):Next:If OK Then F(8)=Z:T(i)=Join(F,"%Trenn%"):W=True
>>%M% echo End If:Next:If W Then fso.CreateTextFile(D).Write Join(T, vbCrLf)
for %%i in ("%Basis%%Maske%") do cscript //nologo %M% "%%i"
Die Informationen über die Anzahl der zu überspringenden Zeilen, die Feldnummern 12 und 9 sowie die Zeichenanzahl (6) am Ende des Feldes 12 sind im Script "hart codiert" (wobei die Zählung der Feldnummern bei 0 beginnt und daher die um 1 verminderten Werte angegeben werden müssen). Das Script ist übrigens nach dem ersten Durchlauf unter "%temp%\ModifyCSV.vbs" zu finden.
Da die Zeilen "in den Dateien" (ohne Sicherungskopie) verändert werden, bitte Vorsicht beim Testen!
Grüße
bastla
Hallo kami202!
Die Fehlermeldung weist darauf hin, dass kein Feld 12 gefunden wurde (was etwa am Trennzeichen oder an einer Leerzeile liegen könnte) - sieh Dir bitte die Daten an (und, soferne möglich) poste die entsprechenden Zeilen unter Verwendung der -Formatierung.
Grüße
bastla
P.S.: Mit Deinen oben dargestellten Testdaten funktioniert der Batch bei mir ...
Die Fehlermeldung weist darauf hin, dass kein Feld 12 gefunden wurde (was etwa am Trennzeichen oder an einer Leerzeile liegen könnte) - sieh Dir bitte die Daten an (und, soferne möglich) poste die entsprechenden Zeilen unter Verwendung der -Formatierung.
Grüße
bastla
P.S.: Mit Deinen oben dargestellten Testdaten funktioniert der Batch bei mir ...
Hallo kami202!
Um sich nicht darauf verlassen zu müssen, dass die letzte Zeile ignoriert werden kann/soll/muss prüft das Script jetzt auf Leerzeilen:
Grüße
bastla
Um sich nicht darauf verlassen zu müssen, dass die letzte Zeile ignoriert werden kann/soll/muss prüft das Script jetzt auf Leerzeilen:
@echo off & setlocal
set "Basis=D:\CSV-Dateien\"
set "Maske=*.csv"
set "Trenn=;"
set M=%temp%\ModifyCSV.vbs
> %M% echo Set fso=CreateObject("Scripting.FileSystemObject"):D=WScript.Arguments(0):T=Split(fso.OpenTextFile(D).ReadAll,vbCrLf)
>>%M% echo W=False:For i=2 To UBound(T):If T(i)^<^>"" Then
>>%M% echo F=Split(T(i),"%Trenn%"):Z=Right(F(11),6):If Len(Z)=6 Then
>>%M% echo OK=1:For j=1 To 6:OK=OK*(Mid(Z,j,1)^>="0")*(Mid(Z,j,1)^<="9"):Next:If OK Then F(8)=Z:T(i)=Join(F,"%Trenn%"):W=True
>>%M% echo End If
>>%M% echo End If:Next:If W Then fso.CreateTextFile(D).Write Join(T, vbCrLf)
for %%i in ("%Basis%%Maske%") do cscript //nologo %M% "%%i"
bastla