Log Datei teilen und zeile als Dateiname auslesen
Log Datei (größe, Zeilen länge unbekannt) auslesen
also ich habe mehre recht grosse log datein
will die einzelt bearbeiten weil sehr stark verteilt auf server.
egal
also die log datei ist gross
zeilen zahl unbekannt
aber nicht größer als 30mb
aufbau:
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
-Block ......sadjkasdasd id:0001
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
-Block ......sadjkasdasd id:0002
ich will nun alles von
Anfang an der Datei
bis Ender der Zeile -Block
das log teilen
und dieses in eine neue Datei schrieben die 0001.txt heisst
also in der Zeile wo "-Block" vor kommt mit tokens bis nach dem "id:" gehen und als var. ausgeben
und diesen den als ren.
a la:
for /f "tokens=2 delims==" %%a in ('findstr "-1Block" %logfile%') do set slpittfileNr=%%a
aber wie tiele ich da die große log datei vorher und benenne den die teile so?
hoffe jemand kann mir schnell helfen
dank schon mal in vorraus fürs druchlesen
allein.
rechtschrieb und coding fehler sind mein eigentum
damit darf nur ich spielen
also ich habe mehre recht grosse log datein
will die einzelt bearbeiten weil sehr stark verteilt auf server.
egal
also die log datei ist gross
zeilen zahl unbekannt
aber nicht größer als 30mb
aufbau:
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
-Block ......sadjkasdasd id:0001
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
bla bla blablab labablabab
-Block ......sadjkasdasd id:0002
ich will nun alles von
Anfang an der Datei
bis Ender der Zeile -Block
das log teilen
und dieses in eine neue Datei schrieben die 0001.txt heisst
also in der Zeile wo "-Block" vor kommt mit tokens bis nach dem "id:" gehen und als var. ausgeben
und diesen den als ren.
a la:
for /f "tokens=2 delims==" %%a in ('findstr "-1Block" %logfile%') do set slpittfileNr=%%a
aber wie tiele ich da die große log datei vorher und benenne den die teile so?
hoffe jemand kann mir schnell helfen
dank schon mal in vorraus fürs druchlesen
allein.
rechtschrieb und coding fehler sind mein eigentum
damit darf nur ich spielen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 88266
Url: https://administrator.de/forum/log-datei-teilen-und-zeile-als-dateiname-auslesen-88266.html
Ausgedruckt am: 07.05.2025 um 06:05 Uhr
23 Kommentare
Neuester Kommentar
Hallo astrarotlichluva und willkommen im Forum!
Das könnte etwa so gehen:
Grüße
bastla
P.S.: Falls es Dir nicht aufgefallen sein sollte: Ich habe "gehen" geschrieben, nicht "laufen" ...
[Edit] Versuch einer Performanceverbesserung durch Schreiben bereits in der "for"-Schleife und nicht erst im Unterprogramm; "Ersatz"-Namensgebung bei bereits vorhandener Zieldatei geändert [/Edit]
[Edit2] Ein "%~1" in das richtige "%%i" geändert und auf Basis der unten geposteten Logdateistruktur angepasst [/Edit2]
[Edit3] Als Sicherheitsvariante für die "Ersatz"-Benennung bereits vorhandener Zieldateien auch Hundertstelsekunden einbezogen [/Edit3]
Das könnte etwa so gehen:
@echo off & setlocal
set "LogDir=D:\Logs"
set "Log=Logdatei.txt"
set "Crit=^-1Block"
set "T=%LogDir%\Temp.txt"
if exist "%T%" del "%T%"
pushd "%LogDir%"
for /f "usebackq delims=" %%i in ("%LogDir%\%Log%") do echo %%i|findstr "%Crit%">nul & if errorlevel 1 (echo %%i >>"%T%") else call :MoveFile "%%i"
popd
goto :eof
:MoveFile
for /f "tokens=8* delims=:" %%a in (%1) do set "LogName=%%b"
:Trim
if "%LogName:~,1%"==" " set "LogName=%LogName:~1%" & goto :Trim
if not exist "%LogName%.txt" move %T% "%LogName%.txt" & goto :eof
set "Tm=0%time%"
set "Tm=%Tm:,=%"
set "Tm=%Tm:.=%"
set "Tm=%Tm: =%"
set "Tm=%Tm:~-10%
set "LogName=%LogName%_%date:~-4%%date:~-7,2%%date:~-10,2%%Tm%"
set "LogName=%LogName::=%
move %T% "%LogName%.txt"
goto :eof
Grüße
bastla
P.S.: Falls es Dir nicht aufgefallen sein sollte: Ich habe "gehen" geschrieben, nicht "laufen" ...
[Edit] Versuch einer Performanceverbesserung durch Schreiben bereits in der "for"-Schleife und nicht erst im Unterprogramm; "Ersatz"-Namensgebung bei bereits vorhandener Zieldatei geändert [/Edit]
[Edit2] Ein "%~1" in das richtige "%%i" geändert und auf Basis der unten geposteten Logdateistruktur angepasst [/Edit2]
[Edit3] Als Sicherheitsvariante für die "Ersatz"-Benennung bereits vorhandener Zieldateien auch Hundertstelsekunden einbezogen [/Edit3]
Hallo astrarotlichluva!
Wenn es keine grundsätzlichen Einwände gegen VBScript gibt, hätte ich hier noch eine Alternative zum Batch:
Grüße
bastla
Wenn es keine grundsätzlichen Einwände gegen VBScript gibt, hätte ich hier noch eine Alternative zum Batch:
'SplitLogFile.vbs
Const LogDir = "D:\Logs"
Const LogFile = "Logdatei.txt"
Const Crit = "-Block"
Set fso = CreateObject("Scripting.FileSystemObject")
LogText = Split(fso.OpenTextFile(LogDir & "\" & LogFile).ReadAll, vbCrLF)
CritLen = Len(Crit)
LogPart = ""
For Each Line In LogText
If Left(Line, CritLen) <> Crit Then
LogPart = LogPart & Line & vbCrLF
Else
LogPartName = Mid(Line, InStrRev(Line, ":") + 1)
If fso.FileExists(LogDir & "\" & LogPartName & ".txt") Then
D = Date
LogPartName = LogPartName & "_" _
& Mid(D, 7) & Mid(D, 4, 2) & Left(D, 2) _
& Replace(Time, ":", "")
fso.CreateTextFile(LogDir & "\" & LogPartName & ".txt").Write LogPart
LogPart = ""
End If
End If
Next
Grüße
bastla
Hallo astrarotlichtluva!
) ...
Die von Dir gepostete "Splitbla.bat" passt nicht unmittelbar für Deine Problemstellung (ihr Ziel ist es, jeweils gleich große Teildateien zu erzeugen). Überdies bezweifle ich, dass sie schneller als meine im ersten Kommentar gepostete Version laufen würde.
Wie sind denn Deine Tests mit meinem Batch von oben ausgegangen?
Grüße
bastla
ne vb geht leider nicht
sry das ich das so spät gesagt habe.
Kein Problem (ich hatte ja auch vorher nicht gefragt sry das ich das so spät gesagt habe.
Die von Dir gepostete "Splitbla.bat" passt nicht unmittelbar für Deine Problemstellung (ihr Ziel ist es, jeweils gleich große Teildateien zu erzeugen). Überdies bezweifle ich, dass sie schneller als meine im ersten Kommentar gepostete Version laufen würde.
Wie sind denn Deine Tests mit meinem Batch von oben ausgegangen?
Grüße
bastla
Moin astrarotlichluva,
bastla hat vollkommen Recht - die SplitBla ist für ähnliche, aber doch andere Zwecke zusammengebraten worden.
Und auch wenn wir hier nicht immer professionelle Lösungen anbieten - wir wollen doch hier nicht Nägel mit der Bohrmaschine in die Wand kloppen.
Wenn es denn partout nur Batch sein darf, ist bastlas Variante schon das relative Optimum.
Was ich bei der Gelegenheit aber noch nachfragen wollte - kannst Du denn nicht früher eingreifen? An irgendeiner Stelle muss doch festgelegt sein, dass EIN riesiges Monsterlogfile geschrieben wird und nicht eines je Vorfall/Prüfvorgang.
Und so ziemlich jede noch so dusselige Anwendung, die überhaupt Logfiles schreibt, hat an dieser Stelle Parametrisierungsmöglichkeiten. Hast Du an der Stelle schon mal geforscht?
Grüße
Biber
bastla hat vollkommen Recht - die SplitBla ist für ähnliche, aber doch andere Zwecke zusammengebraten worden.
Und auch wenn wir hier nicht immer professionelle Lösungen anbieten - wir wollen doch hier nicht Nägel mit der Bohrmaschine in die Wand kloppen.
Wenn es denn partout nur Batch sein darf, ist bastlas Variante schon das relative Optimum.
Was ich bei der Gelegenheit aber noch nachfragen wollte - kannst Du denn nicht früher eingreifen? An irgendeiner Stelle muss doch festgelegt sein, dass EIN riesiges Monsterlogfile geschrieben wird und nicht eines je Vorfall/Prüfvorgang.
Und so ziemlich jede noch so dusselige Anwendung, die überhaupt Logfiles schreibt, hat an dieser Stelle Parametrisierungsmöglichkeiten. Hast Du an der Stelle schon mal geforscht?
Grüße
Biber
Hallo astrarotlichtluva!
vs ursprünglich
ebenfalls gleich oben angepasst - daher bitte für's Testen die editierte Version verwenden ...
Übrigens: Wie gesichert ist die Anzahl der ":" in der "Block-Ende-Zeile" (die Zerlegung basiert - derzeit - darauf, dass es, inkl der in der Uhrzeit enthaltenen, genau 8 vor dem Prüfer- (= dann Datei-)namen sein müssen)?
Grüße
bastla
maybe habe ich da etwas falsch übergeben
Das "echo ist ausgeschaltet" ging auf meine Kappe (beim Herausziehen des Schreibens der einzelnen Zeilen aus dem Unterprogramm hatte ich ein "%~1" nicht auf das richtige "%%i" geändert), den Rest habe ich auf Basis Deiner heute geposteten "echten" Logdaten-1Block: 221 date: 15.05.08 21:27:08 Messaufgabe: Testlauf Probennummer: 844 Schichtfolge: Prüfer: XX
-Block ......sadjkasdasd id:0001
Übrigens: Wie gesichert ist die Anzahl der ":" in der "Block-Ende-Zeile" (die Zerlegung basiert - derzeit - darauf, dass es, inkl der in der Uhrzeit enthaltenen, genau 8 vor dem Prüfer- (= dann Datei-)namen sein müssen)?
Grüße
bastla
Hallo astrarotlichtluva!
Das "setlocal" solltest Du auf jeden Fall belassen (damit werden die in diesem Batch erzeugten Variablen nach dem Ende des Batches wieder gelöscht), und auch "pushd" / "popd" schadet nicht, selbst wenn's nicht benötigt wird (und macht Dich flexibel, den Batch doch noch in einen anderen Ordner legen zu können).
Grüße
bastla
Als Dateiname sollte die Zahl nach "Probennummer:" genommen werden also 6 ":"
Dann muss die Zeile 14 so aussehen (es müssen ja auch noch der Text "Schichtfolge" und die Leerzeichen eliminiert werden):for /f "tokens=7 delims=:" %%a in (%1) do for /f %%f in ("%%a") do set "LogName=%%f"
Das "setlocal" solltest Du auf jeden Fall belassen (damit werden die in diesem Batch erzeugten Variablen nach dem Ende des Batches wieder gelöscht), und auch "pushd" / "popd" schadet nicht, selbst wenn's nicht benötigt wird (und macht Dich flexibel, den Batch doch noch in einen anderen Ordner legen zu können).
Grüße
bastla
Damit wir auf einen gleichen Stand kommen: Bei mir funktioniert dieser Batch (%CD% als Pfad ist berücksichtigt)
mit diesen Testdaten
Es drängt sich daher die Vermutung auf, dass es an der "-1Block"-Zeile liegt (und, nur zur Sicherheit: die letzte Zeile des Logs muss natürlich auch eine solche sein).
Zur Kontrolle könntest Du die Zeile 14 wie folgt ändern und in der nächsten Zeile den ermittelten Dateinamen ausgeben lassen:
Das Ergebnis sieht bei mir so aus:
Grüße
bastla
^^[Edit] Anführungszeichen für "%T%" in Zeilen 16 und 24 nachgetragen [/Edit]
@echo off & setlocal
set "LogDir=%cd%"
set "Log=Logdatei.txt"
set "Crit=^-1Block"
set "T=%LogDir%\Temp.txt"
if exist "%T%" del "%T%"
pushd "%LogDir%"
for /f "usebackq delims=" %%i in ("%Log%") do echo %%i|findstr "%Crit%">nul & if errorlevel 1 (echo %%i >>"%T%") else call :MoveFile "%%i"
popd
goto :eof
:MoveFile
for /f "tokens=7 delims=:" %%a in (%1) do for /f %%f in ("%%a") do set "LogName=%%f"
if not exist "%LogName%.txt" move "%T%" "%LogName%.txt" & goto :eof
set "Tm=0%time%"
set "Tm=%Tm:,=%"
set "Tm=%Tm:.=%"
set "Tm=%Tm: =%"
set "Tm=%Tm:~-10%
set "LogName=%LogName%_%date:~-4%%date:~-7,2%%date:~-10,2%%Tm%"
set "LogName=%LogName::=%
move "%T%" "%LogName%.txt"
goto :eof
1.500020e+002 2.144980e+002 6.963079e+002 nm 2.281911e+002 nm 6.538393e-001 nm 5.020137e+002 nm 1.047534e+002 nm
1.500020e+002 2.144980e+002 7.074566e+002 nm 2.353388e+002 nm 1.580196e+000 nm 5.003358e+002 nm 9.508016e+001 nm
1.500020e+002 2.144980e+002 7.031426e+002 nm 2.331226e+002 nm 3.034034e+000 nm 4.999146e+002 nm 9.026766e+001 nm
1.450000e+002 2.144980e+002 6.959890e+002 nm 2.293731e+002 nm 2.118024e+000 nm 4.951898e+002 nm 9.575802e+001 nm
1.450000e+002 2.144980e+002 6.929615e+002 nm 2.319669e+002 nm -2.133383e+000 nm 5.056529e+002 nm 9.211335e+001 nm
1.450000e+002 2.144980e+002 7.021602e+002 nm 2.271893e+002 nm -1.397261e+000 nm 5.033282e+002 nm 9.374658e+001 nm
1.450000e+002 2.144980e+002 6.695101e+002 nm 2.256670e+002 nm -1.910170e+000 nm 5.140209e+002 nm 1.044900e+002 nm
1.450000e+002 2.144980e+002 6.654938e+002 nm 2.267565e+002 nm -2.567262e-002 nm 5.140038e+002 nm 1.111206e+002 nm
-1Block: 221 date: 15.05.08 21:27:08 Messaufgabe: Testlauf Probennummer: 844 Schichtfolge: Prüfer: XX
2.450000e+002 2.394980e+002 6.213414e+002 nm 2.202457e+002 nm -5.858052e-001 nm 4.958063e+002 nm 1.069977e+002 nm
2.450000e+002 2.394980e+002 6.355864e+002 nm 2.233881e+002 nm -6.122822e-001 nm 4.863254e+002 nm 1.006662e+002 nm
2.450000e+002 2.394980e+002 6.279558e+002 nm 2.217353e+002 nm 1.205401e+000 nm 5.061235e+002 nm 8.045054e+001 nm
2.450000e+002 2.394980e+002 6.179756e+002 nm 2.200851e+002 nm -7.466758e-001 nm 5.098089e+002 nm 9.108561e+001 nm
2.450000e+002 2.394980e+002 6.232181e+002 nm 2.214735e+002 nm -1.618090e-001 nm 5.035816e+002 nm 9.971449e+001 nm
2.399980e+002 2.394980e+002 6.075009e+002 nm 2.256787e+002 nm -1.678107e+000 nm 4.903316e+002 nm 1.047921e+002 nm
2.399980e+002 2.394980e+002 6.206706e+002 nm 2.220294e+002 nm -3.107523e+000 nm 4.880532e+002 nm 1.146785e+002 nm
-1Block: 221 date: 15.05.08 21:29:14 Messaufgabe: Testlauf Probennummer: 845 Schichtfolge: Prüfer: XX
Zur Kontrolle könntest Du die Zeile 14 wie folgt ändern und in der nächsten Zeile den ermittelten Dateinamen ausgeben lassen:
for /f "tokens=7 delims=:" %%a in (%1) do echo "%%a" & for /f %%f in ("%%a") do set "LogName=%%f"
echo "%LogName%"
" 844 Schichtfolge"
"844"
" 845 Schichtfolge"
"845"
Grüße
bastla
^^[Edit] Anführungszeichen für "%T%" in Zeilen 16 und 24 nachgetragen [/Edit]
Wenn Du in den Zeilen 16 und 24 (ist oben in Antwort #15 bereits berücksichtigt) das "%T%" unter Anführungszeichen setzt, sollte es funktionieren (ich hatte leider wieder einmal für meinen Testordner einen Pfad ohne enthaltene Leerzeichen verwendet
).
Grüße
bastla
kann es probleme geben wenn statt 884 ... auch mal - und buchstaben in stehen als dateiname
Solange es keine Leerzeichen, Anführungszeichen oder etwas in der Art von "<|>&" ist, sind eigentlich keine Probleme zu erwarten.Grüße
bastla
Hallo astrarotlichtluva!
Sorry, dass ich nicht schon früher genauer gearbeitet habe - hätte uns einige Zeit erspart ...
Zum Abschluss noch die auf die wesentlichen Teile reduzierte Fassung:
Grüße
bastla
Sorry, dass ich nicht schon früher genauer gearbeitet habe - hätte uns einige Zeit erspart ...
Zum Abschluss noch die auf die wesentlichen Teile reduzierte Fassung:
@echo off & setlocal
for /f "tokens=4" %%g in ('dir *.txt ^|find "exp"') do set "Log=%%g"
set "Crit=^-1Block"
set "TempFile=Temp.txt"
if exist "%TempFile%" del "%TempFile%"
for /f "usebackq delims=" %%i in ("%Log%") do echo %%i|findstr "%Crit%">nul & if errorlevel 1 (echo %%i >>"%TempFile%") else call :MoveFile "%%i"
goto :eof
:MoveFile
for /f "tokens=7 delims=:" %%a in (%1) do for /f %%f in ("%%a") do set "LogName=%%f"
if not exist "%LogName%.txt" move "%TempFile%" "%LogName%.txt" & goto :eof
set "Tm=0%time%"
set "Tm=%Tm:,=%"
set "Tm=%Tm:.=%"
set "Tm=%Tm: =%"
set "Tm=%Tm:~-10%
set "LogName=%LogName%_%date:~-4%%date:~-7,2%%date:~-10,2%%Tm%"
set "LogName=%LogName::=%
move "%TempFile%" "%LogName%.txt"
goto :eof
Grüße
bastla
Moin astrarotlichluva,
da der Beitrag aus Deiner Sicht gelöst zu sein scheint, noch zwei Bitten:
- bitte den Beitrag auch auf "Erledigt" setzen
- und noch einmal von mir die Frage: Kannst Du nicht schon beim Erzeugen dieser Logdatei(en) eingreifen und Logdateien je Prüfvorgang schreiben lassen?
Grüße
Biber
da der Beitrag aus Deiner Sicht gelöst zu sein scheint, noch zwei Bitten:
- bitte den Beitrag auch auf "Erledigt" setzen
- und noch einmal von mir die Frage: Kannst Du nicht schon beim Erzeugen dieser Logdatei(en) eingreifen und Logdateien je Prüfvorgang schreiben lassen?
Grüße
Biber