mikefield
Goto Top

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

Content-ID: 107451

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

bastla
bastla 28.01.2009 um 22:59:34 Uhr
Goto Top
Hallo Mikefield und willkommen im Forum!

Vielleicht solltest Du noch erklären, wie die letzte Textstelle zu finden ist - als Token Nr 138 (mit Leerzeichen oder TAB als Delimiter) oder als erster Dezimalwert (mit ".") ...

Grüße
bastla
Mikefield
Mikefield 28.01.2009 um 23:39:47 Uhr
Goto Top
Das ist es ja. ich hatte es mit der Leerstelle versucht, aber ab Token größer 31 wurde kein Wert mehr ausgegeben. Mit TAB oder Dezimalwert habe ich es nicht versucht, wußte nicht wie.

mf
bastla
bastla 29.01.2009 um 00:15:58 Uhr
Goto Top
Hallo Mikefield!

Eigentlich würde ich in diesem Fall ja eher zu VBScript greifen, aber so recht und schlecht (und frei von jeder Eleganz face-wink) 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
Grüße
bastla
Mikefield
Mikefield 29.01.2009 um 19:24:18 Uhr
Goto Top
Hallo bastla,

was soll ich sagen, es funktioniert! Vielen Dank!!!
Auch wenn ich nur zum Teil verstehe was da passiert.
Die erste for Schleife ist klar, aber dann die Zweite, da haperts:
for /f "usebackq delims=" %%b in ("%%a") do if not defined Zeile set "Zeile=%%b"  
    call :ProcessLine1 "!Zeile!"  
Dieses if not defined Zeile set "Zeile=%%b" will sich mir nicht erklären. Und dann zum Schluß, das "!Zeile!" wie verknüpfen die beiden sich? Hier wird ja nur Zeile 1 ausgewertet, wie wird dieses eingegrenzt?
Zu ProcessLine3, hätte man da nicht auch für den Wert3 ein "Wert3=%~137" setzen können?


Herzlichst
mf
bastla
bastla 29.01.2009 um 19:43:40 Uhr
Goto Top
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.
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 face-wink ...

Grüße
bastla
Mikefield
Mikefield 29.01.2009 um 20:02:18 Uhr
Goto Top
Hallo bastla,

OK, so habe ich es jetzt verstanden, Danke für die Erklärung!
Das mit dem Wert2 ist OK, Du warst zu schnell mit der Antwort. Habe es oben in meiner Antwort schon gelöscht. Dummerweise hatte ich in der falschen Datei reingeschaut und da stand die 3 woanders. Also mein Fehler.

Besten Dank!
mf

Nachtrag: Gibt es noch die Möglichkeit den Punkt in 16.8 durch ein Komma zu ersetzen?
Exel macht da immer 16. August draus.

mf
bastla
bastla 30.01.2009 um 21:07:54 Uhr
Goto Top
Hallo Mikefield!
Gibt es noch die Möglichkeit den Punkt in 16.8 durch ein Komma zu ersetzen?
Sollte so gehen:
set "Wert3=%Wert3:.=,%"
Grüße
bastla
Mikefield
Mikefield 31.01.2009 um 21:32:42 Uhr
Goto Top
Hat funktioniert, besten Dank!

Gruß
Mikefield
Mikefield
Mikefield 28.02.2009 um 17:28:56 Uhr
Goto Top
Hallo Bastla!

Ich habe mal noch eine Frage zu den Zeilen 09 und 13.
In Zeile 09 steht !Zeile! in "", in Zeile 13 nicht. Wenn ich diese auch in "" setze funktioniert die weitere Verarbeitung nicht. So richtig will sich das mir nicht erschließen ...
Hängt das mit der Übergabe zusammen, da in ProcessLine3 keine For Schleife ist?

Herzlichst
mf
bastla
bastla 28.02.2009 um 17:37:45 Uhr
Goto Top
Hallo Mikefield!

Die in Zeile 13 übergebene !Zeile! soll ja nicht als ein einziger Parameter (was die Folge ist, wenn Du sie unter Anführungszeichen setzt), sondern als eine Folge von, durch Leerzeichen getrennten, Parametern an das Unterprogramm übergeben werden.

Grüße
bastla
Mikefield
Mikefield 28.02.2009 um 17:44:19 Uhr
Goto Top
Hallo Bastla!

Habe es verstanden!

Danke
mf