Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Werte aus grosser Textdatei per batch oder vbs

Frage Entwicklung Batch & Shell

Mitglied: pacmac

pacmac (Level 1) - Jetzt verbinden

16.06.2009, aktualisiert 14:48 Uhr, 5753 Aufrufe, 11 Kommentare

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
Mitglied: LotPings
16.06.2009 um 15:12 Uhr
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.

01.
@Echo off&setlocal EnableDelayedExpansion 
02.
Set OutFile=^>^>"C:\Test\Res.txt" 
03.
Set "InFile=C:\Test\Test.txt" 
04.
For /f "tokens=1-3 delims=: " %%A in ( 
05.
 'Findstr /i "^Aktenz ^Ergebnis" "%InFile%"' 
06.
 ) do If "%%A"=="Aktenz" ( 
07.
 set "AZ=%%B %%C" 
08.
 ) Else ( 
09.
%OutFile% Echo/!AZ! %%B 
10.
11.
 
Gruß
LotPings

Ausgabeumleitung ergänzt.
Edit2 Anführungszeichen verschoben in Zeile 02
Bitte warten ..
Mitglied: 60730
16.06.2009 um 15:14 Uhr
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.

01.
@echo off 
02.
set PF=c:\quelle.txt 
03.
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
Bitte warten ..
Mitglied: sebuba
16.06.2009 um 15:44 Uhr
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
lg
Bitte warten ..
Mitglied: pacmac
16.06.2009 um 18:47 Uhr
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 )
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... 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
Bitte warten ..
Mitglied: LotPings
16.06.2009 um 18:55 Uhr
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
Bitte warten ..
Mitglied: pacmac
16.06.2009 um 21:11 Uhr
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 ;)
Bitte warten ..
Mitglied: LotPings
16.06.2009 um 21:28 Uhr
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
Bitte warten ..
Mitglied: pacmac
16.06.2009 um 22:15 Uhr
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
Bitte warten ..
Mitglied: sebuba
17.06.2009 um 06:57 Uhr
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

  
@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
Bitte warten ..
Mitglied: LotPings
17.06.2009 um 10:10 Uhr
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).

01.
::Sebuba.cmd :::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
02.
@echo off 
03.
Set OutFile=^>^>".\res.txt" 
04.
Set InFile=.\test.txt 
05.
for /f "tokens=*" %%x in ('type %InFile%') do call :findit %%x  
06.
pause  
07.
goto :eof  
08.
:findit  
09.
if "%1"=="Aktenz" set AZ=%3 %4 
10.
if Not "%1"=="Ergebnis" goto :Eof 
11.
%OutFile% echo %AZ% %3,%4
Gruß
LotPings
Bitte warten ..
Mitglied: sebuba
17.06.2009 um 11:22 Uhr
Na dann sag ich herzlichen Dank, .. und mir leuchten die Punkte ein!
Danke

lg
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Entwicklung
gelöst Mit Batch,VBS,Powershell Windows einrichten (1)

Frage von Justin98 zum Thema Entwicklung ...

Windows 7
gelöst Batch-Skript oder VBS Skript zum Sichern von Office Vorlagen (2)

Frage von Ceejaay zum Thema Windows 7 ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...