pacmac
Goto Top

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

Content-Key: 118283

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

Printed on: April 26, 2024 at 00:04 o'clock

Mitglied: 77559
77559 Jun 16, 2009 at 13:12:22 (UTC)
Goto Top
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.

@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
Mitglied: 60730
60730 Jun 16, 2009 at 13:14:25 (UTC)
Goto Top
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.

@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
Member: sebuba
sebuba Jun 16, 2009 at 13:44:17 (UTC)
Goto Top
Ich weiß nicht ob ich das Problem verstanden habe .. aber falls nicht wirst dich ja noch melden ;)
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
%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 face-smile
lg
Member: pacmac
pacmac Jun 16, 2009 at 16:47:05 (UTC)
Goto Top
Hallo zusammen und erstmal vielen Dank für die Vorschläge!

Leider lüppt das immernoch nicht...am nächsten kommt noch das script von Timo, dann erhalte ich (mit dem Besipieltext von oben) dies Resultat:

Aktenz : A 12345-09
Ergebnis : 2,34 cm
Aktenz : A 23456-09
Ergebnis : 1,75 cm

Allerdings benötige ich nur das jeweilige Aktenzeichen und nur das Ergebnis (also ohne Aktenz :/Ergebnis : davor und ohne cm Angabe) in einer Zeile, so dass der Inhalt der Ausgabedatei wie folgt aussieht:

A 12345-09 2,34
A 23456-09 1,75
A XXXXX-09 X,XX
A XXXXX-09 X,XX
usw...

..hättet Ihr noch ein Idee?
Wie gesagt ich bin nicht so bewandert mit batch, wurde aber vom Chef "verdonnert" (Sie kümmern sich face-smile )
Die Ausgabedatei ist zur Übermittlung für eine Arztpraxis gedacht, die das nur in dem Format einlesen können. Der Beispieltext ist praktisch ein Auszug einer Protokolldatei aus der ich nun diese Zeilen filtern muss. Ich dachte eigentlich, dass ich das mit meinen laienhaften Kenntnissen hinbekomme, doch wie man sieht... face-smile sah erst ganz einfach aus *g*

Ich studiere gerade ein wenig in wikibooks über batch zwecks "Umformatierung", vielleicht habt Ihr ja noch ne Lösung?!

Nochmals Vielen Dank!
Gruss pacmac
Mitglied: 77559
77559 Jun 16, 2009 at 16:55:10 (UTC)
Goto Top
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
Member: pacmac
pacmac Jun 16, 2009 at 19:11:43 (UTC)
Goto Top
Ui das ging fix, sorry war kochen...

danke für die Hilfe, aber entweder habe ich was auf den Augen oder ich bin zu blöd...wenn ich meinen Beispieltext als neue Textdatei im Ordner C:\Test anlege und dein unverändertes Script als Lot.bat von C: laufen lasse, bekomme ich über cmd 2x die Meldung "Das System kann den angegebenen Pfad nicht finden". *confused* Ich hab die Prozedur jetzt ein paar Mal gemacht, wie gesagt in deiner Batch keine Pfade angepasst und den obigen Text in C:\Test\Test.txt gespeichert...

Ich zweifle grad an mir selbst, kannst du mir die Augen öffnen?

Gruss
pacmac

edit: achso das mit den Ankerpunkten kann ich so ziemlich nachvollziehen ;)
Mitglied: 77559
77559 Jun 16, 2009 at 19:28:16 (UTC)
Goto Top
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
Member: pacmac
pacmac Jun 16, 2009 at 20:15:23 (UTC)
Goto Top
Hallo,

das sieht ja wirklich gut aus! Ich probiere es morgen im Job mit der Originaldatei, ich geb dann nochmal bescheid! Danke!


Gruss und schönen Abend!
pacmac
Member: sebuba
sebuba Jun 17, 2009 at 04:57:44 (UTC)
Goto Top
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
Mitglied: 77559
77559 Jun 17, 2009 at 08:10:27 (UTC)
Goto Top
Hallo sebuba,

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
Member: sebuba
sebuba Jun 17, 2009 at 09:22:18 (UTC)
Goto Top
Na dann sag ich herzlichen Dank, .. und mir leuchten die Punkte ein!
Danke face-smile

lg