Frage von cwendel, 67

for schleife Batch Datei Datum formatieren?

Hi Leute ich habe ein Problem mit einer .bat (Batch)

Ausgangsdatei: test.csv hat folgenden Inhalt: 1;201520;52850;0001;UA;4056204084816;in_stock;;745;1;0;Y;N 1;201520;52857;0001;UA;4055263786044;in_stock;;486;1;0;Y;N 1;201520;52858;0001;UA;4055263856440;in_stock;;1733;1;0;Y;N 1;201520;52859;0002;UA;4055263855719;in_stock;;880;1;0;Y;N 1;201520;52860;0002;UA;4055263884474;in_stock;;1157;1;0;Y;N 1;201520;52861;0001;UA;4055263299247;in_stock;;902;1;0;Y;N 1;201520;52862;0001;UA;4055263780097;in_stock;;739;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;in_stock;;55;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20151103;4715;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20151229;445;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160119;1300;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160202;1238;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160209;389;1;0;Y;N 1;201520;53054;0001;OSFA;4056204028681;incoming;20160216;160;1;0;Y;N 1;201520;67195;0001;UA;4049754368031;in_stock;;0;1;0;Y;N 1;201520;70287;0002;UA;4051909278393;in_stock;;0;1;0;Y;N 1;201520;70287;0003;UA;4051909278379;in_stock;;0;1;0;Y;N

Was ich nun brauche ist das alle mit "in_stock" rausfliegen und nur die erste Zeile mit "incoming" erhalten bleibt. Zudem muß die Spalte mit dem Datum von 20151103 in 03.11.2015 umformatiert werden. Bisher steht in meiner bat folgendes:

@echo off & setlocal
set "quellordner=C:\tmp\vorher\"
set "zielordner=C:\tmptest\"

pushd "%quellordner%"
for /f "delims=" %%i in ('dir /b /a-d test.csv') do findstr /v "in_stock" "%%i">"%zielordner%\%%i"
popd

jedoch bekomme ich so nur die incomming und

Antwort
von S1r1us13, 64
@echo off
cd C:\tmp\vorher
Setlocal EnableDelayedExpansion
FOR /F "tokens=1-13 delims=;" %%A IN ('findstr "incoming" "test.csv"') DO (
  if not defined Datum (
    set Datum=%%H
    set Datum=!Datum:~6,2!.!Datum:~4,2!.!Datum:~0,4!
  )
  if not defined Zeile set Zeile=%%A;%%B;%%C;%%D;%%E;%%F;%%G;!Datum!;%%I;%%J;%%K;%%L;%%M
)
echo !Zeile!>"C:\tmptest\test.csv"
exit /b

Der FOR-Befehl teilt die Zeilen jeweils in 13 Zellen auf mit Semikolon als Trennzeichen. Von der ersten Zeile mit "incoming" wird die 8. Zelle (%%H = Datumsspalte) gespeichert und in das gewünschte Format geändert.

Anschließend wird die komplette Zeile kopiert, allerdings statt der 8. Zelle das Datum im neuen Format geschrieben.

Die bearbeitete (einzelne) Zeile wird in die gewünschte Datei geschrieben und CMD schließt sich.

Kommentar von cwendel ,

fast perfekt! Leder gibt es in der neuen Datei aber nur eine Zeile aus. In der test.csv stehen aber etliche Werte (Ist nur ein Auszug). Ich möchte jeweils die erste Zeile mit "incoming" und ungleicher EAN (Im Beispiel:4056204028681) Nummer!

Also ist die EAN Nummer gleich der unteren Zeile dann nur immer die oberste verwenden.

Kommentar von cwendel ,
@echo offcd C:\tmp\Setlocalfor /f "tokens=1-13 delims=;" %%A IN ('findstr "incoming" "test.csv"') DO (  Setlocal EnableDelayedExpansion  set Datum=%%H  set Datum=!Datum:~6,2!.!Datum:~4,2!.!Datum:~0,4!  echo=%%A;%%B;%%C;%%D;%%E;%%F;%%G;!Datum!;%%I;%%J;%%K;%%L;%%M >>"C:tmp\test\test.csv")

Habe ich jetzt! Damit bekomme ich alle Incomings mit Richtigen Datum. Wie aber bekomme ich jetzt noch die doppelten einträge raus?? Also wenn Incoming und die Nummer (Beispiel 4056204028681) gleich sind nur die erste Zeile???
Kommentar von S1r1us13 ,

In dem folgenden Code ist ein Zähler (engl. "counter"), der jede erste Zeile einspeichert. Außerdem wird für jede EAN eine eigene Datums-Variable angelegt:

@echo off
cd C:\tmp\vorher Setlocal EnableDelayedExpansion set Counter=0 FOR /F "tokens=1-13 delims=;" %%A IN ('findstr "incoming" "test.csv"') DO ( if not defined Datum%%F ( set Datum%%F=%%H set Datum%%F=!Datum%%F:~6,2!.!Datum%%F:~4,2!.!Datum%%F:~0,4! set /a Counter+=1 set Zeile!Counter!=%%A;%%B;%%C;%%D;%%E;%%F;%%G;!Datum%%F!;%%I;%%J;%%K;%%L;%%M   )
)
FOR /L %%A IN (1,1,!Counter!) DO echo !Zeile%%A! >> "C:\tmptest\test.csv" Endlocal
exit /b

Du darfst den SETLOCAL-Befehl übrigens nicht in die FOR-Schleife packen. Der Befehl erstellt einen neuen Speicherraum, in dem Variablen erneut festgelegt werden. Dadurch kann eine Variable zwar mehrere verschiedene Werte haben, allerdings können diese Werte nur pro Raum gelesen werden. Sprich in dem letzten Raum könntest du nur den letzten Wert auslesen.

Antwort
von maximilianus7, 67

ich denke da überforderst du batch und findstr etwas. ich würde sowas in VBS machen. da kannst du auch mit split auf die einzelnen felder zugreifen.

Keine passende Antwort gefunden?

Fragen Sie die Community