arnie79
Goto Top

TXT-Dateien mit Batch verarbeiten

Hallo zusammen,
ich benötige Hilfe bei der Verarbeitung mehrerer TXT-Dateien mittels Batch. Ich habe mehrere Textdateien a.txt, b.txt usw., die wie folgt aufgebaut sind:

Datum:;01.01.2012
Quelle:;Standort
Zeit;;;SpalteA;SpalteB;SpalteC;SpalteD;SpalteE;SpalteF;SpalteG;SpalteH
Gesamt;;0;0;0;0;0;0;0;0;0
7:15;-;7:30;0;0;0;0;0;0;0;0;0
7:30;-;7:45;0;0;0;0;0;0;0;0;0

Die wichtigen Zeilen beginnen für mich ab Zeile 4, da sich dort die eigentlichen Daten befinden. Mit dem folgenden Batch Code nehme ich, alle
Dateien und schreibe jeweils alle Zeilen außer die ersten 4 in die Datei total.txt mit der Ergänzung, dass ich die Quelle noch als zusätzliche Spalten anhänge.
Das klappt auch alles ganz gut. Was ich aber einfach nicht hinbekomme ist es, von jeder Datei das Datum aus der ersten Zeile in eine Variable zu schreiben
und dann ebenfalls als zusätzliche Spalte in die Zieldatei zu schreiben.

set "source=C:\"  
set var="";  
type nul > temp.txt
type nul > total.txt
for /D %%a in (a.txt, b.txt, c.txt, d.txt) do 
(
  set "filename=%%a"  
  copy /Y "%source%%%a" temp.txt  
  call :delLines
)
goto :eof

:delLines
for /f "tokens=1* delims=:" %%i in ('findstr /n $ temp.txt') do  
(
  if %%i gtr 4 
  (
    echo %%j;%filename:~0,-4% >> total.txt
  )
)
goto :eof
exit

Hier meine Versuch, der nicht funktioniert:

:delLines
for /f "tokens=1,* delims=:" %%i in ('findstr /n $ temp.txt') do  
 (
  if %%i lss 2
 (
    set var=%%j
  )
  if %%i gtr 4 
  ( 
    echo %%j;%filename:~0,-4%%var:~6% >> total.txt
  )
)

Ich hoffe, dass der Beitrag ok so ist. Ich habe auch bereits gesucht, und vieles ausprobiert, es aber nicht hinbekommen, weshalb ich also einen neuen Beitrag verfasst habe.

Gruß Arne

Content-Key: 178662

Url: https://administrator.de/contentid/178662

Printed on: April 24, 2024 at 23:04 o'clock

Member: bastla
bastla Jan 10, 2012 at 12:11:17 (UTC)
Goto Top
Hallo Arnie79!

Du könntest im einfachsten Fall das Datum (inkl Semikolon davor) so ausgeben:
set /p "Zeile1=<temp.txt"  
echo %Zeile1:~6%
Um übrigens Zeilen zu überspringen gibt es
for /f "skip=3 ..."
Außerdem ist in Zeile 5 die Option "/D" genauso unnötig, wie "/Y" in Zeile 8 ...

Schließlich kannst Du noch das "exit" einsparen oder durch ein "goto :eof" ersetzen.

Einen hab ich noch: Wenn Du nur den Dateinamen (ohne Typ) haben möchtest, kannst Du entweder in der Schleife anstelle von "a.txt" nur "a" verwenden und dann eben das ".txt" in Zeile 8 hinzufügen oder die Zeile 7 auf
set "filename=%%~na"
ändern bzw den Dateinamen beim Aufuf des Unterprogramms als Parameter übergeben und die Variable %filename% ganz einsparen:
...
call :delLines "%%~na"  
...
echo %%j;%~1%Zeile1:~6%
Grüße
bastla
Member: icsat
icsat Jan 10, 2012 at 12:24:42 (UTC)
Goto Top
Hallo Arne,

es wäre hilfreich gewesen, wenn Du kurz geschrieben hättest, was genau bei Deinem Versuch nicht funktioniert. und welche Ausgabe Du bekommst.

Suche mal nach "setlocal EnableDelayedExpansion", denn die in der for-Schleife gesetzte Variable "var" ist sonst erst nach dem beenden der for-Schleife mit dem neuen Inhalt verwendbar.

Du könntest "var" am Anfang mal auf "irgendwas" setzten um zu sehen was ich meine.
Dannach könntest Du das script mit
setlocal EnableDelayedExpansion
beginnen und die Ausgabe auf
echo %%j;%filename:~0,-4%!var! >> total.txt
ändern.

Das sollte Dich erst mal weiter bringen.


Gruß icsAT
Member: bastla
bastla Jan 10, 2012 at 13:53:23 (UTC)
Goto Top
@icsat
Nur als Anmerkung: Da die Ausgabe der Variablen %filename% erst im Unterprogramm (und damit einer neuen CMD-Instanz) erfolgt, ist "delayedExpansion" nicht erforderlich (aber, wie oben schon erwähnt: das trifft auch auf die Variable selbst zu ) ...

Grüße
bastla
Member: icsat
icsat Jan 10, 2012 at 14:21:54 (UTC)
Goto Top
Hey bastla,

Grundsätzlich ist Deine Aussage bezüglich der Variablen "filename" richtig, ich habe jedoch von "var" und nicht von "filename" gesprochen, oder?

Natürlich ist Deine Variante schicker, ich wollte nur schnell auf einen mögliches Problem im Skript des TE hinweisen ohne einen völlig neuen Ansatz zu verfolgen. Ich Hatte Deinen Post vor meinem auch nicht gesehen, sonst hätte ich vermutlich gar nicht geantwortet, weil Du Dir ja schon die Mühe gemacht hast diverse Schwächen des Skriptes aufzuzeigen und entsprechende Verbesserungsvorschläge zu posten.


In diesem Sinne einen schönen Tag noch

icsAT
Member: bastla
bastla Jan 10, 2012 at 15:49:26 (UTC)
Goto Top
Hallo icsat!
ich habe jedoch von "var" und nicht von "filename" gesprochen, oder?
Yep - sorry, hatte ich leider zu wenig genau gelesen ... face-sad

Grüße
bastla
Member: Arnie79
Arnie79 Jan 11, 2012 at 09:05:14 (UTC)
Goto Top
Hallo,
zunächst vielen Dank für die Antworten. Wäre wohl deutlich besser gewesen zu erwähnen wo genau mein Problem war. Also im Prinzip ging es um die Variable var, die mir immer den Initialwert ausgegeben hat und nicht den Wert den innerhalb der Funktion gesetzt habe. Mit dem Ansatz con icsat konnte ich das sehr schnell beheben und es läuft nun wie ich es wollte. Trotzdem würde ich auch gerne den anderen Ansatz verstehen, weil ich diesen ebenfalls ausprobiert habe und nicht das gewünschte Ergebnis bekommen habe.

Ich habe
set /p "Zeile1=<temp.txt"  
in die erste FOR Schleife gepackt, mit dem Ergebnis, dass meine bat-Datei immer an dieser Stelle mit einem Hinweis anhält und eine Tasteneingabe erwartet. Das Problem, dass ich innerhalb der Funktion nicht so richtig Zugriff auf die Variable besteht bei diesem Ansatz aber weiterhin. Was genau befindet sich sich nach dem Befehl denn in der Variable Zeile1.

Gruß Arne
Member: bastla
bastla Jan 11, 2012 at 11:21:40 (UTC)
Goto Top
Hallo Arnie79!

Die entsprechende Zeile soll nicht in der Schleife (womit auch keine "delayedExpansion" erforderlich wird), sondern als erste Zeile im Unterprogramm ":delLines" verwendet werden. Nach Ausführung des Befehls enthält %Zeile1% den Inhalt der ersten Zeile der Datei "temp.txt".

Grüße
bastla