arnie79
Goto Top

Verabeitung von txt-Dateien mittels Batch Verarbeitung

Hallo zusammen,
ich benötige Hilfe bei der Verarbeitung einer txt-Datei mittels Batch. Dabei geht es mir eigentlich nur um die Verarbeitung an sich. Es liegt folgende Ausgangssituation in Form der gegebenen txt-Datei vor:

& blabla
& blabla
& blabla - blabla
& blabla : blabla
& blabla
& blabla
& 01.06.12 00:00:00 - 01.07.12 00:00:00
& blabla

system1;8295860,0;1,54317897728E11;2088,504638671875;100,0;
system2;537980,0;1,5625690112E10;34119,76953125;100,0;
system3;8072,0;9,2398864E7;3749,3681640625;100,0;
system4;302408,0;7,40592384E9;3025,327880859375;100,0;
system5;73592,0;6,57774016E8;1318,2540283203125;100,0;

Ziel ist es jetzt die Kommentare zu überspringen und die restlichen Zeilen in eine Datei zu schreiben, wobei allerdings die Information 01.06.12 aus der einen Kommentarzeile jeweils ans Ende der einzelnen Zeilen hängen.

system4;302408,0;7,40592384E9;3025,327880859375;100,0;01.06.12
system5;73592,0;6,57774016E8;1318,2540283203125;100,0;01.06.12

Ich habe es erstmal so gemacht:

type nul >temp.txt
call :test_1
goto :eof

:test_1
for /f "tokens=1,2,3* delims=: " %%i in ('findstr /n $ 2012-06-01\test.txt') do (  
if not %%j==& (
 echo %%j >>temp.txt
)
)
goto :eof
exit

Das kam dabei heraus

ECHO ist eingeschaltet (ON).
system4;302408,0;7,40592384E9;3025,327880859375;100,0;01.06.12
...
system5;73592,0;6,57774016E8;1318,2540283203125;100,0;01.06.12
ECHO ist eingeschaltet (ON).


Problem sind diese Meldungen am Anfang und am Ende und ich weiß nicht wie das Datum herausbekomme.


Arnie79

Content-Key: 189518

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

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

Member: ColdZero89
ColdZero89 Aug 13, 2012 at 12:39:18 (UTC)
Goto Top
Moin,

mach am anfang mal ein @echo off

face-smile

Gruß Zero
Member: Arnie79
Arnie79 Aug 13, 2012 at 12:51:06 (UTC)
Goto Top
Hallo,
hatte vergessen zu erwähnen, dass ich das schon versucht habe.

Das Ergebnis ist, dass nun am Anfang und Ende jeweils

ECHO ist ausgeschaltet (OFF).

steht. Nächster versuch ist in Zeile 8

echo. %%j >>temp.txt

Das Ergebnis sieht dann so aus:


system4;302408,0;7,40592384E9;3025,327880859375;100,0;
system5;73592,0;6,57774016E8;1318,2540283203125;100,0;


Also ne Leerzeile am Anfang und Ende und Leerzeichen vor den Zeilen.

Arnie79
Member: ColdZero89
ColdZero89 Aug 13, 2012 updated at 13:41:56 (UTC)
Goto Top
Moin,

müsste das Script nicht so aussehen? Zeile 11 geändert. Du sagst ihm "goto eof" aber wo isn eof? denke das soll das am ende sein oder? damit er danach ein Exit macht.

type nul >temp.txt
call :test_1
goto :eof

:test_1
for /f "tokens=1,2,3* delims=: " %%i in ('findstr /n $ 2012-06-01\test.txt') do (  
if not %%j==& (
 echo %%j >>temp.txt
)
)

:eof
exit

Gruß zero
Member: Arnie79
Arnie79 Aug 13, 2012 at 13:47:23 (UTC)
Goto Top
Hallo,
:eof bedeutet end of file und springt ans Ende der Datei. Zumindest im oberen Block müsste das notwendig sein, sonst würde er die Funktion zweimal ausführen.

Gruß Arnie79
Member: der-blob
der-blob Aug 13, 2012 updated at 14:02:05 (UTC)
Goto Top
Hallöchen, ich vermute mal es hat was mit den leeren zeilen zu tun.. ;)
denn
echo >>C:\temp\temp.txt

bringt ja auch "ECHO ist eingeschaltet (ON)."
Und in der leeren zeile hast du ja nur einen Token dein %%i und kein %%j, also steht in der zeile 8 von dein Code:

echo >>temp.txt



Wenn du also dein code so änderst sollte dies funktionieren:

type nul >temp.txt
call :test_1
goto :eof

:test_1
for /f "tokens=1,2,3* delims=: " %%i in ('findstr /n $ 2012-06-01\test.txt') do (  
if not %%j==& (
 if not "%%j"=="" (  
  echo %%j >>temp.txt
 )
)
)
goto :eof
exit
Member: ColdZero89
ColdZero89 Aug 13, 2012 at 14:30:45 (UTC)
Goto Top
Moin,

was ich mich immer noch frage: Wohin führt das goto :eof

Ich denke das - aus der-bobs code - goto :eof aus Zeile 13 muss zu einem einfachen :eof gemacht werden ^^

Gruß Zero
Member: der-blob
der-blob Aug 13, 2012 updated at 14:39:17 (UTC)
Goto Top
Tag Cold, wie Arnie schon gesagt hat das EOF heist End Of File, also er geht einfach ans ende der Datei.
wenn man also möchte das nach z.B einer if abfrage man zum ende will, einfach ein goto :eof
man spart sich also goto sprungmarke ...... und gaaaaannnnzzzzzz unten das :sprungmarke


"Mit EOF (End of File) wird das Ende einer Quelle signalisiert, welche in der Regel eine Datei oder ein Datenstrom ist."
Quelle:
http://de.wikipedia.org/wiki/End_of_File

€ wobei bei den ganzen das exit ziemlich sinnlos dort steht, da dieses ja nie erreicht wird.
Member: bastla
bastla Aug 13, 2012 at 14:52:03 (UTC)
Goto Top
Hallo ColdZero89!
Ich denke das - aus der-bobs code - goto :eof aus Zeile 13 muss zu einem einfachen :eof gemacht werden ^^
Wenn sicher ist, dass nach dem Unterprogramm ":test_1" keine weiteren Zeilen hinzugefügt werden, sind sowohl Zeile 14 (die immer) als auch Zeile 13 unnötig ...

... ansonsten wäre "goto :eof" am besten mit "Beende Block" zu übersetzen - in Zeile 3 ist damit der Batch ("Hauptprogramm") gemeint, daher wird tatsächlich der Batch beendet; in Zeile 13 wird dadurch das Ende des Unterprogramms signalilsiert (entspräche einem "Return" in Ur-Basic, oder einem "End Sub") - falls erforderlich, könnte so zB ab Zeile 14 ein weiteres Unterprogramm hinzugefügt werden ...

Grüße
bastla
Member: ColdZero89
ColdZero89 Aug 13, 2012 at 14:59:31 (UTC)
Goto Top
Ja Moinsen,

/OT
Ich rieche Feierabend!!!!
/OT

Ok den Beitrag von Arnie hab ich net gesehen - wir haben wohl Zeitgleich geschrieben ^_^ ansonsten erklärt sich das jap face-big-smile

Danke, man lernt täglich dazu.

Gruß zero
Member: bastla
bastla Aug 13, 2012 updated at 16:56:16 (UTC)
Goto Top
... wobei es eigentlich (fast) ganz ohne "goto :eof" ginge, da zumindest ein Unterprogramm ja gar nicht nötig ist - wenn insbesondere auch keine Leerzeilen im Ergebnis aufscheinen sollen, dürfte ja schon
@echo off & setlocal
set "Ein=2012-06-01test.txt"  
set "Aus=Ergebnis.txt"  

set "Datum="  
for /f "tokens=2" %%i in ('findstr /brc:"& [0-9][0-9]\.[0-9][0-9]\.[0-9][0-9] " "%Ein%"') do set "Datum=%%i"  
if not defined Datum echo Datum nicht gefunden! & goto :eof

del "%Aus%" 2>nul  
for /f "delims=" %%i in ('findstr /vb "&" "%Ein%"') do >>"%Aus%" echo %%i%Datum%  
genügen ... face-wink

Grüße
bastla
Member: Arnie79
Arnie79 Aug 14, 2012 at 08:25:34 (UTC)
Goto Top
Hallo zusammen,

erstmal vielen Dank für die Hilfe, klappt super.

Zitat von @bastla:
...ein Unterprogramm ja gar nicht nötig ist - wenn insbesondere auch keine Leerzeilen im Ergebnis aufscheinen sollen ...

Könntest du mir das vielleicht genauer erklären, also den Zusammenhang Leerzeile und Unterprogram?

Gruß Arnie79
Member: bastla
bastla Aug 14, 2012 updated at 08:46:39 (UTC)
Goto Top
Hallo Arnie79!
den Zusammenhang Leerzeile und Unterprogram?
... wollte ich gar nicht herstellen (anstelle des "-" in meinem Kommentar würde sich ein ";" anbieten) - gemeint war: Wenn keine Leerzeilen im Ergebnis benötigt werden, genügt der obige Ansatz (= "findstr" ohne "/n") ...

Grüße
bastla
Member: Arnie79
Arnie79 Aug 14, 2012 at 11:42:34 (UTC)
Goto Top
Hallo bastla,

das habe ich dann falsch verstanden. Hätte da aber noch etwas. Wie gesagt, bei der einen Datei klappt das super. Ich habe da jetzt noch ne Schleife drum herum gebaut, um mehrere Dateien zu verarbeiten. Leider klappt das nicht, genauer gesagt werden die Daten schon richtig in die Datei geschrieben, aber das Datum in diesem Fall nicht angehangen. Was habe ich hier falsch gemacht?

@echo off & setlocal
set "Aus=temp.txt"  
del "%Aus%" 2>nul  
for /R .\2012-06-01 %%a in (*monthly*.txt) do (
  set "Datum="  
  for /f "tokens=2" %%i in ('findstr /brc:"& [0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]" "%%a"') do set "Datum=%%i"  
  if not defined Datum echo Datum nicht gefunden! & goto :eof
  for /f "delims=" %%i in ('findstr /vb "&" "%%a"') do echo %%i%Datum% >>"%Aus%"   
)

Gruß Arnie79
Member: bastla
bastla Aug 14, 2012 at 13:10:36 (UTC)
Goto Top
Hallo Arnie79!

Was hier fehlt, ist "delayedExpansion" (Erklärungen dazu findest Du in diversen Threads und natürlich im Tutorial zur FOR-Schleife):
@echo off & setlocal enabledelayedexpansion
set "Aus=temp.txt"  
del "%Aus%" 2>nul  
for /R .\2012-06-01 %%a in (*monthly*.txt) do (
  set "Datum="  
  for /f "tokens=2" %%i in ('findstr /brc:"& [0-9][0-9]\.[0-9][0-9]\.[0-9][0-9]" "%%a"') do set "Datum=%%i"  
  if not defined Datum echo Datum nicht gefunden! & goto :eof
  for /f "delims=" %%i in ('findstr /vb "&" "%%a"') do >>"%Aus%" echo %%i!Datum!  
)
Grüße
bastla
Member: Arnie79
Arnie79 Aug 14, 2012 at 13:49:39 (UTC)
Goto Top
Hallo bastla,

Danke, jetzt klappt alles!

Gruß Arnie79