Bestimmte Stellen von Textdateien auslesen und in neue Datei schreiben
Werte aus Reportdateien extrahieren und in eine Datei schreiben, zwecks späterem Excel Import
Hallo in die Runde, das ist ein Superforum und eine wahre Fundgrube. Habe schon viel versucht und noch mehr gesucht. Aber nun bin ich doch am Ende meines Halbwissens. Ich habe hier Textdateien die täglich erstellt und mit dem aktuellen Datum versehen werden. Am Monatsende sollen diese Textdateien ausgewertet und die Resultate in einer Datei geschrieben werden. Aus diesen Dateien benötige ich zum einen den Wochentag aus der ersten Zeile und 3 Textelemente aus der 3. Zeile. Diese Textelemente habe ich mit "" gekennzeichnet, diese sind dort sonst nicht enthalten. Dummerweise greift hier die for Schleife nur bei den ersten beiden Werten, aber "Tokens=" geht nur bis 31. Set /P geht auch nicht, da die Zahlen unterschiedliche Längen haben und so immer wieder variieren. lmld_2009-01-23.txt
Das Ergebnis soll wie folgt aussehen, pro Datei eine Zeile, diese soll später mal in Excel impoertiert werden :
20090123;23;3;16.8
20090124;24;5;18.6
.
.
.
Soweit bin ich für die 3. Zeile schon mal gekommen, aber wie nun weiter? Die erste Zeile für sich bekomme ich auch nicht separiert. OK, das Datum kann man auch aus 20090123 nehmen, die 23. Aber da hilft die for Schleife auch nicht viel weiter. Und alle Werte sollen ja in einer Zeile stehen ....
Ich bedanke mich schon mal im Voraus. Es gibt noch weitere Dateien die ähnlich aufgebaut sind, aber diese hier ist der größte Knackpunkt und ich denke wenn das funktioniert, kann ich die anderen davon ableiten.
mf
Hallo in die Runde, das ist ein Superforum und eine wahre Fundgrube. Habe schon viel versucht und noch mehr gesucht. Aber nun bin ich doch am Ende meines Halbwissens. Ich habe hier Textdateien die täglich erstellt und mit dem aktuellen Datum versehen werden. Am Monatsende sollen diese Textdateien ausgewertet und die Resultate in einer Datei geschrieben werden. Aus diesen Dateien benötige ich zum einen den Wochentag aus der ersten Zeile und 3 Textelemente aus der 3. Zeile. Diese Textelemente habe ich mit "" gekennzeichnet, diese sind dort sonst nicht enthalten. Dummerweise greift hier die for Schleife nur bei den ersten beiden Werten, aber "Tokens=" geht nur bis 31. Set /P geht auch nicht, da die Zahlen unterschiedliche Längen haben und so immer wieder variieren. lmld_2009-01-23.txt
2009-01-23 7:02 PM - textblablabla
"20090123" 1903 0 0 0 0 0 0 "3" 6276 963 119 80 174 27 102 85 95 60 43 110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 102 30 5 5 5 3 5 5 4 4 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "16.8" 475.2 0.6 0.1 0 16.1 1
Das Ergebnis soll wie folgt aussehen, pro Datei eine Zeile, diese soll später mal in Excel impoertiert werden :
20090123;23;3;16.8
20090124;24;5;18.6
.
.
.
Soweit bin ich für die 3. Zeile schon mal gekommen, aber wie nun weiter? Die erste Zeile für sich bekomme ich auch nicht separiert. OK, das Datum kann man auch aus 20090123 nehmen, die 23. Aber da hilft die for Schleife auch nicht viel weiter. Und alle Werte sollen ja in einer Zeile stehen ....
@Echo off
setlocal EnableDelayedExpansion
for /f "delims=" %%a in ('Dir /b /o:n lmld*.txt') do (
for /f "skip=2 delims=" %%b in ('"type %%a"') do (
Ich bedanke mich schon mal im Voraus. Es gibt noch weitere Dateien die ähnlich aufgebaut sind, aber diese hier ist der größte Knackpunkt und ich denke wenn das funktioniert, kann ich die anderen davon ableiten.
mf
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 107451
Url: https://administrator.de/contentid/107451
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo Mikefield!
Eigentlich würde ich in diesem Fall ja eher zu VBScript greifen, aber so recht und schlecht (und frei von jeder Eleganz ) müsste sich das doch auch in Batch machen lassen:
Grüße
bastla
Eigentlich würde ich in diesem Fall ja eher zu VBScript greifen, aber so recht und schlecht (und frei von jeder Eleganz ) müsste sich das doch auch in Batch machen lassen:
@echo off & setlocal enabledelayedexpansion
set "Erg=D:\Ergebnisdatei.txt"
if exist "%Erg%" del "%Erg%"
for /f "delims=" %%a in ('Dir /b /o:n lmld*.txt') do (
set Zeile=
for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"
call :ProcessLine1 "!Zeile!"
set Zeile=
for /f "usebackq skip=2 delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"
call :ProcessLine3 !Zeile!
)
goto :eof
:ProcessLine1
for /f "tokens=3 delims=- " %%i in (%1) do set "Tag=%%i"
goto :eof
:ProcessLine3
set "Datum=%~1"
set "Wert2=%~9"
for /L %%i in (1,1,137) do shift
set "Wert3=%~1"
>>"%Erg%" echo %Datum%;%Tag%;%Wert2%;%Wert3%
goto :eof
bastla
Hallo Mikefield!
Allgemein: Mit "if defined Variable" kann überprüft werden, ob es die Variable bereits gibt.
Da ich vorweg mit "set Zeile=" die Variable %Zeile% lösche, ist beim ersten Durchlaufen der "for"-Schleife diese Variable nicht vorhanden ("not defined") und wird daher mit dem Inhalt der Zeile 1 erstellt. Bei jedem weiteren Durchlauf ist die Variable dann aber schon da, sodass sie nicht mehr neu gesetzt wird und nach der Schleife daher immer noch die Zeile 1 enthält.
Die Schreibweise "!Zeile!" anstelle von "%Zeile%" ist bei Verwendung von "delayedExpansion" erforderlich - letzteres wiederum wird benötigt, damit schon innerhalb der (äußeren) "for"-Schleife auf den Inhalt der neu erstellten Variablen zugegriffen werden kann - und diese wird benötigt, damit sie an das Unterprogramm als Liste von Parametern übergeben (und dadurch dort dann zerpflückt) werden kann.
Wird das oft genug gemacht (dafür die Zählschleife bis 137), ist schließlich Parameter 138 als %1 anzusprechen - nicht sehr elegant, aber, wie's scheint, doch effektiv ...
Grüße
bastla
Allgemein: Mit "if defined Variable" kann überprüft werden, ob es die Variable bereits gibt.
Da ich vorweg mit "set Zeile=" die Variable %Zeile% lösche, ist beim ersten Durchlaufen der "for"-Schleife diese Variable nicht vorhanden ("not defined") und wird daher mit dem Inhalt der Zeile 1 erstellt. Bei jedem weiteren Durchlauf ist die Variable dann aber schon da, sodass sie nicht mehr neu gesetzt wird und nach der Schleife daher immer noch die Zeile 1 enthält.
Die Schreibweise "!Zeile!" anstelle von "%Zeile%" ist bei Verwendung von "delayedExpansion" erforderlich - letzteres wiederum wird benötigt, damit schon innerhalb der (äußeren) "for"-Schleife auf den Inhalt der neu erstellten Variablen zugegriffen werden kann - und diese wird benötigt, damit sie an das Unterprogramm als Liste von Parametern übergeben (und dadurch dort dann zerpflückt) werden kann.
Zu ProcessLine3, dieses set "Wert2=%~9" wie wird hier gezählt, denn der 9. Wert in der Zeile ist es ja nicht.
Doch - mit "Wert2" ist ja "3" gemeint.Hätte man da nicht auch für den Wert3 ein "Wert3=%~137" setzen können?
Nein - bei %9 ist Schluss; daher werden mit "shift" die Parameter "nach links verschoben": %1 fällt weg, %2 wird %1, %3 wird %2 and so on ...Wird das oft genug gemacht (dafür die Zählschleife bis 137), ist schließlich Parameter 138 als %1 anzusprechen - nicht sehr elegant, aber, wie's scheint, doch effektiv ...
Grüße
bastla