Batch - Bestimmte Zeilen aus txt auslesen und in neue txt schreiben
huhu zusammen,
ich möchte mithilfe von einem batch immer die ersten xx Zeilen und die letzten yy Zeilen auslesen und in eine neue txt schreiben.
Das Logfile quasi kürzen. Es soll immer Zeile 1 - X und Zeile Y - Ende ausgeschnitten werden.
Den Wert für ZeileX und ZeileY finde ich im ersten Teil raus ... und im 2ten Teil erfolgt dann die Ausgabe. Allerdings hab ich folgendes Problem. In dem Logfile gibt es einige Leerzeilen. Bei meinem Ausgabeverfahren werden diese Leerzeilen allerdings nicht als Zeilen anerkannt wodurch sich die ganze Sache verkürzt bzw. die für X und Y nicht mehr stimmen.
Sprich aus
wird
wie bekomme ich es hin, das diese Leerzeilen korrekt mit übernommen werden?
ich möchte mithilfe von einem batch immer die ersten xx Zeilen und die letzten yy Zeilen auslesen und in eine neue txt schreiben.
Das Logfile quasi kürzen. Es soll immer Zeile 1 - X und Zeile Y - Ende ausgeschnitten werden.
@echo off & setlocal enabledelayedexpansion
find /n "Sicherung begonnen" test.log > rctmp.txt
for /F "delims= skip=2 tokens=1" %%a in (rctmp.txt) do if not defined zeilex set "zeileX=%%a"
find /n "šberprfung abgeschlossen" test.log > rctmp.txt
for /F "delims= skip=2 tokens=1" %%a in (rctmp.txt) do set zeileY=%%a
set /a Zeile=0
for /f "delims=" %%i in ('type test.log') do (
set /a Zeile+=1
if /I !Zeile! LEQ !zeile1! (
echo %%i
) >> output.txt
if /I !Zeile! GEQ !Zeile2! (
echo %%i
) >> output.txt
)
Den Wert für ZeileX und ZeileY finde ich im ersten Teil raus ... und im 2ten Teil erfolgt dann die Ausgabe. Allerdings hab ich folgendes Problem. In dem Logfile gibt es einige Leerzeilen. Bei meinem Ausgabeverfahren werden diese Leerzeilen allerdings nicht als Zeilen anerkannt wodurch sich die ganze Sache verkürzt bzw. die für X und Y nicht mehr stimmen.
Sprich aus
Sicherungsstatus
Vorgang: Sicherung
Aktives Sicherungsziel: 4mm DDS
Mediumname: "Band 20071115-0300"
Volumeschattenkopie-Erstellung: Versuch 1.
Sicherung von "E: Daten"
Sicherungssatz #1 auf Medium #1
Sicherungsbeschreibung: "Band 20071115-0300"
Mediumname: "Band 20071115-0300"
Sicherungsart: Normal
Sicherung begonnen am 15.11.2007 um 03:01.
wird
Sicherungsstatus
Vorgang: Sicherung
Aktives Sicherungsziel: 4mm DDS
Mediumname: "Band 20071115-0300"
Volumeschattenkopie-Erstellung: Versuch 1.
Sicherung von "E: Daten"
Sicherungssatz #1 auf Medium #1
Sicherungsbeschreibung: "Band 20071115-0300"
Mediumname: "Band 20071115-0300"
Sicherungsart: Normal
Sicherung begonnen am 15.11.2007 um 03:01.
wie bekomme ich es hin, das diese Leerzeilen korrekt mit übernommen werden?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 75730
Url: https://administrator.de/contentid/75730
Ausgedruckt am: 23.11.2024 um 00:11 Uhr
16 Kommentare
Neuester Kommentar
Was macht den "DEQ" ?
Hallo lorus11 und willkommen im Forum!
Dein Thema hatten wir (in ähnlicher Form) neulich hier ...
Grüße
bastla
Dein Thema hatten wir (in ähnlicher Form) neulich hier ...
Grüße
bastla
Moin lorus11,
optimieren oder (was meistens ja nur gemeint ist) für performantere Verarbeitung sorgen lässt sich ja immer auf zwei Arten
In der einen Batchzeile ist das einzig Schnelle natürlich die "findstr"-Verarbeitung.
Diese muss aber
Wenn Du also von den 5000 Zeilen eigentlich nur die ersten x (mit x<100) und die letzten y (mit y<100) Zeilen brauchst, dann solltest Du vorher mit einem geeignetem "Findstr /v"-Befehl alle Body/Detail-Zeilen des Logfiles wegfiltern.
Irgendetwas Gemeinsames werden diese Zeilen ja haben, ein "..copied.." oder ein "c:\..."?
Wenn Du dieses Kriterium ermittelt hast, dann machen wir weiter.
Grüße
Biber
optimieren oder (was meistens ja nur gemeint ist) für performantere Verarbeitung sorgen lässt sich ja immer auf zwei Arten
- dasselbe machen wie bisher, aber schneller (neuerer Rechner, *.exe-Datei statt Batch-Interpreter,...)
- oder die Lösungsstrategie bzw. die Grundvoraussetzungen ändern
In der einen Batchzeile ist das einzig Schnelle natürlich die "findstr"-Verarbeitung.
Diese muss aber
- eine Textdatei von 5000 Zeilen durchpflügen (nicht schlimm),
- diese aber während der Verarbeitung als "virtuelle Datei" im Hauptspeicher halten (schon schlimm) und
- alle 5000 Zeilen auf den Bildschirm ausgeben, auch wenn die wenigsten dort ankommen (ganz ganz stinkelangsam).
Wenn Du also von den 5000 Zeilen eigentlich nur die ersten x (mit x<100) und die letzten y (mit y<100) Zeilen brauchst, dann solltest Du vorher mit einem geeignetem "Findstr /v"-Befehl alle Body/Detail-Zeilen des Logfiles wegfiltern.
Irgendetwas Gemeinsames werden diese Zeilen ja haben, ein "..copied.." oder ein "c:\..."?
Wenn Du dieses Kriterium ermittelt hast, dann machen wir weiter.
Grüße
Biber
Hallo lorus11!
Als Kombination aus Biber's Vorschlägen, insbesondere
Für Testzwecke sind Ein- und Ausgabedatei fest "verdrahtet", aber das lässt sich natürlich im Fall des Falles etwas benutzerfreundlicher gestalten.
"BisText" und "VonText" werden nur am Anfang der Zeile und nur in der angegebenen Schreibweise (mit Unterscheidung Groß-/Kleinschreibung) gesucht. Sollte einer der beiden Texte nicht gefunden werden, erhältst Du eine Fehlermeldung und einen Errorlevel 1.
In der Ausgabe sind zwischen den beiden Blöcken noch exemplarisch Trennlinien und Leerzeilen platziert.
Starten lässt sich das Script bei Bedarf auch aus einer Batchdatei, wobei auch eine Abfrage des Errorlevels erfolgen kann - Beispiel:
Grüße
bastla
Als Kombination aus Biber's Vorschlägen, insbesondere
die Lösungsstrategie ändern
kann ich Dir ein VBScript (nicht wegen des schnelleren Interpreters , sondern wegen der erweiterten Möglichkeiten zur Textbearbeitung) vorschlagen:Quelle = "D:\Test.log"
Ziel = "D:\output.txt"
BisText = "Sicherung begonnen"
VonText = "Überprüfung abgeschlossen"
Set fso = CreateObject("Scripting.FileSystemObject")
LogText = Split(fso.OpenTextFile(Quelle, 1).ReadAll, vbCrLF)
LogZeilen = UBound(LogText)
BisZeile = 0
BisLen = Len(BisText)
For i = 0 To LogZeilen
If Left(LogText(i), BisLen) = BisText Then
BisZeile = i
Exit For
End If
Next
VonZeile = 0
VonLen = Len(VonText)
For i = LogZeilen To 0 Step -1
If Left(LogText(i), VonLen) = VonText Then
VonZeile = i
Exit For
End If
Next
If (BisZeile * VonZeile) Then
Set Z = fso.OpenTextFile(Ziel, 2, True)
For i = 0 To BisZeile
Z.WriteLine LogText(i)
Next
Z.WriteLine "----------------------------------------------------------------------------"
Z.WriteBlankLines 3 '3 Leerzeilen erzeugen
Z.WriteLine "----------------------------------------------------------------------------"
For i = VonZeile To LogZeilen
Z.WriteLine LogText(i)
Next
Z.Close
Else
WScript.Echo "Logdaten nicht korrekt!"
WScript.Quit 1
End If
"BisText" und "VonText" werden nur am Anfang der Zeile und nur in der angegebenen Schreibweise (mit Unterscheidung Groß-/Kleinschreibung) gesucht. Sollte einer der beiden Texte nicht gefunden werden, erhältst Du eine Fehlermeldung und einen Errorlevel 1.
In der Ausgabe sind zwischen den beiden Blöcken noch exemplarisch Trennlinien und Leerzeilen platziert.
Starten lässt sich das Script bei Bedarf auch aus einer Batchdatei, wobei auch eine Abfrage des Errorlevels erfolgen kann - Beispiel:
Grüße
bastla
Hallo lorus11!
Zur Parameterübergabe kannst Du so vorgehen:
Der Quelldateiname wird zwingend verlangt, der Zieldateiname kann (als zweiter Parameter) ebenfalls übergeben werden, ansonsten gilt der Defaultname.
Aufruf:
bzw
Grüße
bastla
Zur Parameterübergabe kannst Du so vorgehen:
If WScript.Arguments.Count < 1 Then
WScript.Echo "Keine Quelldatei angegeben!"
WScript.Quit 1
End If
Quelle = WScript.Arguments(0)
Ziel = "D:\Defaultziel.txt"
If WScript.Arguments.Count > 1 Then Ziel = WScript.Arguments(1)
...
Aufruf:
cscript //nologo "C:\Scripts\TrimLog.vbs" "D:\Test.log" "D:\output.txt" || goto :Fehler
cscript //nologo "C:\Scripts\TrimLog.vbs" "%Quelldatei%" "%Zieldatei%" || goto :Fehler
Grüße
bastla
Moin lorus11,
Dann müsstest Du hier:
bastla kann das aber besser erklären...
Grüße
Biber
Woran könnte das liegen?
Sonnenflecken, Seitenwind oder aber NTBackup schreibt in Unicode. Dann müsstest Du hier:
LogText = Split(fso.OpenTextFile(Quelle, 1).ReadAll, vbCrLF)
...als VIERTEN Parameter von OpenTextFile ein "-1" für "NimmDatDingenAlsUniKot" angeben.LogText = Split(fso.OpenTextFile(Quelle, 1, False, -1).ReadAll, vbCrLF)
bastla kann das aber besser erklären...
Grüße
Biber
Moin lorus11,
es ist wie verhext - den meisten Kommentartext schreibe ich immer zur Erläuterung von Halbzeilern...
Wahrscheinlich eins der noch nicht ausformulierten Murphy's Laws.
In der Zeile
Von der will ich aber gar nichts.
Der vierte Parameter, den ich vorgeschlagen habe, gehört zur Methode OpenTextFile() des FileSystemObjects. Schau Dir die Klammer-Auf und Klammer-Zu dieser Methode innerhalb der geposteten Zeile an, dort stehen 4 Parameter.
Von der Funktion Split(), bei der Du recherchiert hast, ist nur der Parameter 2 (Trennzeichen=vbCrLF) genutzt.
Grüße
Biber
es ist wie verhext - den meisten Kommentartext schreibe ich immer zur Erläuterung von Halbzeilern...
Wahrscheinlich eins der noch nicht ausformulierten Murphy's Laws.
In der Zeile
LogText = Split(fso.OpenTextFile(Quelle, 1, False, -1).ReadAll, vbCrLF)
..ist außen herum zwar eine Funktion Split() mit durchaus 4 möglichen Parametern.Von der will ich aber gar nichts.
Der vierte Parameter, den ich vorgeschlagen habe, gehört zur Methode OpenTextFile() des FileSystemObjects. Schau Dir die Klammer-Auf und Klammer-Zu dieser Methode innerhalb der geposteten Zeile an, dort stehen 4 Parameter.
Von der Funktion Split(), bei der Du recherchiert hast, ist nur der Parameter 2 (Trennzeichen=vbCrLF) genutzt.
Grüße
Biber
Moin lorus11,
und? Kann dann langsam ein Haken dran?
Oder sind noch Fragen offen?
Grüße
Biber
[Edit] Haken ist dran (THX @lorus11), also schliesse ich den Thread.[/Edit]
und? Kann dann langsam ein Haken dran?
Oder sind noch Fragen offen?
Grüße
Biber
[Edit] Haken ist dran (THX @lorus11), also schliesse ich den Thread.[/Edit]