for schleife Batch Datei Datum formatieren?

2 Antworten

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.

@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.

cwendel 
Fragesteller
 28.10.2015, 19:40

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.

0
cwendel 
Fragesteller
 29.10.2015, 15:27
@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???
0
S1r1us13  29.10.2015, 19:15
@cwendel

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.

0