Werte aus grosser Textdatei per batch oder vbs
Hallo an alle,
ich bin neu hier und begrüsse erstmal das Forum. Ich habe hier schon sehr viel gelesen und mir Tips und Hilfen rausgesucht, doch jetzt habe ich selbst ein Anliegen, für viele von euch wahrscheinlich ein klacks, aber ich krieg es einfach nicht hin. Vorab, ich bin kein Programmierspezialist würde aber gern folgendes per Batch oder auch vbs realisieren...Ich habe auch hier ein paar Sachen gefunden die in die Richtung gehen, aber irgendwie bin ich jetzt durcheinander.
Ich habe eine grosse Textdatei aus der ich bestimmte Werte auslesen und in eine neue Textdatei schreiben möchte.
In der Textdatei steht z.B. folgendes:
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichen
Aktenz : A 12345-09
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen#
Ergebnis : 2,34 cm
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
Aktenz : A 23456-09
textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
Ergebnis : 1,75 cm
...
Nun soll das Script nur die Nummer des Aktenz. (A xxxxx-09) und den Ergeniswert x,xx in eine neue Textdatei schreiben. Das Ausgabeformat sollte so aussehen:
A 12345-09 2,34
A 23456-09 1,75
A XXXXX-09 X,XX
A XXXXX-09 X,XX
usw...
Die Position (Zeile) des Aktenz. und des Ergenisses sind nicht immer gleich, aber die Zeichenanzahl (auch Leerzeichen) in der Zeile bleiben gleich (also Aktenz : A xxxxx-xx und Ergebnis : 1,75 cm) und zu jedem AZ gehört ein Ergebnis.
Wäre echt super wenn mir jemand helfen kann, ich vermute, dass es über den findstr-Befehl oder auch for /f funktionieren müsste aber ich kriegs nicht hin und blick auch nicht mehr richtig durch. Ich hoffe ich habe es verständlich erklärt?!
/edit -> Was ich bis jetzt versucht habe ist folgendes:
@echo off
set PF=c:\quelle.txt
findstr /C:"Aktenz." %PF% > akt.txt
findstr /C:"Ergebnis" %PF% > erg.txt
copy akt.txt+erg.txt res.txt
-> das kommt in der res.txt raus
Aktenz. : A 38552-09
Aktenz. : A 38553-09
Aktenz. : A 38554-09
Aktenz. : A 38555-09
Ergebnis : 0,24 cm
Ergebnis : 0,00 cm
Ergebnis : 1,44 cm
Ergebnis : 0,59 cm
Ich bekomme es einfach nicht hin NUR die Aktenz. und NUR die Ergebnisse und diese auch noch hintereinander in eine Textdatei zu schreiben.
Würde mich sehr freuen wenn jemand helfen kann
Vielen Dank für Beiträge!
Gruss pacmac
ich bin neu hier und begrüsse erstmal das Forum. Ich habe hier schon sehr viel gelesen und mir Tips und Hilfen rausgesucht, doch jetzt habe ich selbst ein Anliegen, für viele von euch wahrscheinlich ein klacks, aber ich krieg es einfach nicht hin. Vorab, ich bin kein Programmierspezialist würde aber gern folgendes per Batch oder auch vbs realisieren...Ich habe auch hier ein paar Sachen gefunden die in die Richtung gehen, aber irgendwie bin ich jetzt durcheinander.
Ich habe eine grosse Textdatei aus der ich bestimmte Werte auslesen und in eine neue Textdatei schreiben möchte.
In der Textdatei steht z.B. folgendes:
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichen
Aktenz : A 12345-09
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen#
Ergebnis : 2,34 cm
viel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
Aktenz : A 23456-09
textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
viel textmitsonderzeichenviel textmitsonderzeichenviel textmitsonderzeichen
Ergebnis : 1,75 cm
...
Nun soll das Script nur die Nummer des Aktenz. (A xxxxx-09) und den Ergeniswert x,xx in eine neue Textdatei schreiben. Das Ausgabeformat sollte so aussehen:
A 12345-09 2,34
A 23456-09 1,75
A XXXXX-09 X,XX
A XXXXX-09 X,XX
usw...
Die Position (Zeile) des Aktenz. und des Ergenisses sind nicht immer gleich, aber die Zeichenanzahl (auch Leerzeichen) in der Zeile bleiben gleich (also Aktenz : A xxxxx-xx und Ergebnis : 1,75 cm) und zu jedem AZ gehört ein Ergebnis.
Wäre echt super wenn mir jemand helfen kann, ich vermute, dass es über den findstr-Befehl oder auch for /f funktionieren müsste aber ich kriegs nicht hin und blick auch nicht mehr richtig durch. Ich hoffe ich habe es verständlich erklärt?!
/edit -> Was ich bis jetzt versucht habe ist folgendes:
@echo off
set PF=c:\quelle.txt
findstr /C:"Aktenz." %PF% > akt.txt
findstr /C:"Ergebnis" %PF% > erg.txt
copy akt.txt+erg.txt res.txt
-> das kommt in der res.txt raus
Aktenz. : A 38552-09
Aktenz. : A 38553-09
Aktenz. : A 38554-09
Aktenz. : A 38555-09
Ergebnis : 0,24 cm
Ergebnis : 0,00 cm
Ergebnis : 1,44 cm
Ergebnis : 0,59 cm
Ich bekomme es einfach nicht hin NUR die Aktenz. und NUR die Ergebnisse und diese auch noch hintereinander in eine Textdatei zu schreiben.
Würde mich sehr freuen wenn jemand helfen kann
Vielen Dank für Beiträge!
Gruss pacmac
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 118283
Url: https://administrator.de/contentid/118283
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo pacmac,
wenn gewährleistet ist, das Aktenz und Ergebnis immer paarweise auftreten, merkst du dir einfach das Aktenzeichen und gibst es mit jedem Ergebnis aus. Das ^ in findstr sorgt für einen Anker am Zeilenanfang.
Gruß
LotPings
Ausgabeumleitung ergänzt.
Edit2 Anführungszeichen verschoben in Zeile 02
wenn gewährleistet ist, das Aktenz und Ergebnis immer paarweise auftreten, merkst du dir einfach das Aktenzeichen und gibst es mit jedem Ergebnis aus. Das ^ in findstr sorgt für einen Anker am Zeilenanfang.
@Echo off&setlocal EnableDelayedExpansion
Set OutFile=^>^>"C:\Test\Res.txt"
Set "InFile=C:\Test\Test.txt"
For /f "tokens=1-3 delims=: " %%A in (
'Findstr /i "^Aktenz ^Ergebnis" "%InFile%"'
) do If "%%A"=="Aktenz" (
set "AZ=%%B %%C"
) Else (
%OutFile% Echo/!AZ! %%B
)
Gruß
LotPings
Ausgabeumleitung ergänzt.
Edit2 Anführungszeichen verschoben in Zeile 02
Servus und auch dir ein herzliches Willkommen,
dein "Problem" ist folgendes:
die Batch läuft jede Zeile nacheinander ab und deswegen kommen zuerst alle im ersten Schritt gefilterten Infos und dann die im zweiten Schritt.
sollte - mit deinem Ansatz weitergedacht - eher zum Ziel führen.
Ist aber "ungetestet" und da du Sonderzeichen schreibst, vielleicht nicht die richtig wahre Lösung deines Problems.
Try it.
Gruß
edit ... da war ich wohl etwas langsam..../edit
dein "Problem" ist folgendes:
die Batch läuft jede Zeile nacheinander ab und deswegen kommen zuerst alle im ersten Schritt gefilterten Infos und dann die im zweiten Schritt.
@echo off
set PF=c:\quelle.txt
findstr "Aktenz. Ergebnis" %PF%>res.txt
sollte - mit deinem Ansatz weitergedacht - eher zum Ziel führen.
Ist aber "ungetestet" und da du Sonderzeichen schreibst, vielleicht nicht die richtig wahre Lösung deines Problems.
Try it.
Gruß
edit ... da war ich wohl etwas langsam..../edit
Ich weiß nicht ob ich das Problem verstanden habe .. aber falls nicht wirst dich ja noch melden ;)
würd es so angehen:
%1 , %2 bzw. wie viel du von der Zeile mitnehmen willst, hängt natürlich von der Quelle bzw. dem Ziel ab.
ja war auch nicht grad der schnellste, lol .. ja grundideen hast ja jetzt
lg
würd es so angehen:
@echo off
for /f "tokens=*" %%x in ('type C:\Temp\newprobs\quelle.txt') do call :findit %%x
pause
goto :eof
:findit
if "%1"=="Aktenz." echo "%1 %2 %3" >> C:\Temp\newprobs\res.txt
if "%1"=="Ergebnis." echo "%1 %2" >> C:\Temp\newprobs\res.txt
ja war auch nicht grad der schnellste, lol .. ja grundideen hast ja jetzt
lg
Ich habe deinen Beispieltext von oben kopiert und damit erzeugt meine Batchdatei exakt die von dir gewünschte Ausgabe. Etwas an deinen Angaben scheint also nicht mit der Realität übereinzustimmen.
Gruß
LotPings
Gruß
LotPings
Hallo pacmac,
sorry, die nachträglich eingefügte Änderung ist schuld.
Ich habe es zu gut gemeint. Das vordere Anführungszeichen in Zeile 02 gehört vor D: oder die carets ^^ müssen weg.
Ich ändere es jetzt oben nochmal.
Dann klappts auch.
Gruß
LotPings
sorry, die nachträglich eingefügte Änderung ist schuld.
Ich habe es zu gut gemeint. Das vordere Anführungszeichen in Zeile 02 gehört vor D: oder die carets ^^ müssen weg.
Ich ändere es jetzt oben nochmal.
Dann klappts auch.
Gruß
LotPings
Hallo pacmac,
habs mir jez nochmals durchgelesen, und mich gewundert wieso mein skript nicht funktioniert ;) .. also es waren nur mittels % .. zu ändern, und natürlich wonach du filterst. Hab das auf alle Fälle jez anpasst .. der vollständigkeithalber? :D
<code type="plain>
@echo off
for /f "tokens=*" %%x in ('type C:\Temp\newprobs\btch\quelle.txt') do call :findit %%x
pause
goto :eof
:findit
if "%1"=="Aktenz" echo %3 %4 >> C:\Temp\newprobs\btch\res.txt
if "%1"=="Ergebnis" echo %3 %4 >> C:\Temp\newprobs\btch\res.txt
habs mir jez nochmals durchgelesen, und mich gewundert wieso mein skript nicht funktioniert ;) .. also es waren nur mittels % .. zu ändern, und natürlich wonach du filterst. Hab das auf alle Fälle jez anpasst .. der vollständigkeithalber? :D
<code type="plain>
@echo off
for /f "tokens=*" %%x in ('type C:\Temp\newprobs\btch\quelle.txt') do call :findit %%x
pause
goto :eof
:findit
if "%1"=="Aktenz" echo %3 %4 >> C:\Temp\newprobs\btch\res.txt
if "%1"=="Ergebnis" echo %3 %4 >> C:\Temp\newprobs\btch\res.txt
Hallo sebuba,
weil du dich um eine Lösung bemühst hier ein paar wohlgemeinte Hinweise von mir:
Hier eine angepasste Version deiner Batchdatei, welche den Vorgaben entsprricht, aber ggfs eben Probleme mit Sonderzecihen hat und deutlich langsamer sein dürfte als meine obige Version (was sich aber nur bei großen Dateien auswirkt).
Gruß
LotPings
weil du dich um eine Lösung bemühst hier ein paar wohlgemeinte Hinweise von mir:
- findstr ist sehr viel effizienter bei großen Dateien und hat auch keine Probleme mit Sonderzeichen oder auch "verifteten" Zeichen wie &<|>.
- Anders als bei einer for Schleife mit delims hast du bei der Übertragung von Parametern per Call nicht die Möglichkeit bestimmte Trenner wie das Komma auszuschliessen. In deiner Batchdatei wird es entfernt.
- In deiner Batchdatei werden die gefundenen Zeilen auch nicht wie gewünscht zusammengefasst.
- Auch bei solch kleinen Batchdateien ist es sinnvoll Ein-/Ausgabedateien über eine Variable zu bestimmen, es erleichtert die Anpassung an die jeweilige (Test-)Umgebung.
- Eine Batchdatei lässt sich mit Zeilennummern viel einfacher kommentieren, dafür gibt es die Tags < code> und < /code>.
- Wenn du Ausgaben in eine Datei umleitest ist es nicht immer gewünscht das auch das Leerzeichen vor dem >> in der Datei erscheint, man kann dann einfach die Umleitung vor dem Befehl plazieren.
Hier eine angepasste Version deiner Batchdatei, welche den Vorgaben entsprricht, aber ggfs eben Probleme mit Sonderzecihen hat und deutlich langsamer sein dürfte als meine obige Version (was sich aber nur bei großen Dateien auswirkt).
::Sebuba.cmd ::::::::::::::::::::::::::::::::::::::::::::::::::::::::
@echo off
Set OutFile=^>^>".\res.txt"
Set InFile=.\test.txt
for /f "tokens=*" %%x in ('type %InFile%') do call :findit %%x
pause
goto :eof
:findit
if "%1"=="Aktenz" set AZ=%3 %4
if Not "%1"=="Ergebnis" goto :Eof
%OutFile% echo %AZ% %3,%4
Gruß
LotPings