amverzweifeln
Goto Top

Ausgelesene Zeile als echo verfügbar, bekomme sie aber nicht in eine Variable

Hallo erstmal an alle die das lesen,

ich bin im Batch schreiben blutiger Anfänger.

Ich möchte aus einer sehr großen (kann bis 200MB groß werden) txt Datei die letzte Zeile auslesen und weiter verarbeiten. Das Auslesen und auf dem Bildschirm ausgeben gelingt mir mit folgendermaßen:

FOR /F "skip=%ZN% delims=" %%i IN (C:\Windows\Temp\Work.txt) do echo %%i

Will ich dieses nun im Scribt einer Variable übergeben:

FOR /F "skip=%ZN% delims=XXX" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
oder
FOR /F "skip=%ZN% delims=XXX" %%i IN (C:\Windows\Temp\Work.txt) do "Set ZT=%%i"

bleibt die Variable leer.

Der Zeilenaufbau in der Datei sieht folgendermaßen aus:
m 16:50:35|main Speed 381.22 Mh/s gpu/0 31.77 gpu/1 31.77 gpu/2 31.77 gpu/3 31.77 gpu/4 31.77 gpu/5 31.77 gpu/6 31.77 gpu/7 31.92 gpu/8 31.62 gpu/9 31.77 gpu/10 31.77 gpu/11 31.77 [A6101+88:R7+2:F0] Time: 18:37

Bin für jeden Lösungsansatz dankbar

Content-Key: 367767

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

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: Pedant
Pedant 12.03.2018 um 16:57:32 Uhr
Goto Top
Hallo AmVerzweifeln,

wenn Du die Datei zeilenweise durchläufst, dann wird "echo" für jede Zeile ausgeführt.
Bei "set" ist es ebenso, allerdings wird die Variable jedesmal neu belegt und nur die letzte Belegung bleibt nach der Schleife bestehen.
Sollte die letzte Belegung einen leeren Wert zuordnen, so ist auch Deine Variable leer, respektive ungesetzt.

FOR /F "skip=%ZN% delims=" %%i IN (C:\Windows\Temp\Work.txt) do  
	(
	echo Wert: %%i
	if not "%%i"=="" set ZT=%%i  
	)
echo ZT: %ZT%

Schau mal was dabei raukommt.

Auf skip=%ZN% und delims=XXX" kann ich mir keinen Reim machen.
Da fehlen wohl Infos deinerseits.

Gruß Frank
Mitglied: AmVerzweifeln
AmVerzweifeln 12.03.2018 um 17:14:27 Uhr
Goto Top
Hallo Pedant,

danke das Du dir das angesehen hast.

%ZN% ist die entsprechende Zeilennummer
XXX ist eine Zeichenfolge die auf keinen Fall im Text vorhanden ist.

Ich bin mittlerweile zu Testzwecken dazu übergegangen die einzelnen Tokens auszulessen. Wollte auf die Art feststellen ob der Text irgendwelche Unverträglichkeiten hat. Beim Versuch den Zweiten Token (16:51:43|main) auszulesen schmiert er ab.
Ich denke das, dass Sonderzeichen"|" die Übergabe in die Variable verhindert. Die anderen Werte kann ich als Spalte extrahieren.
Aber wie beschrieben ich bin Batch Anfänger.
Im Ergebnis komme ich so an fast alles was ich an Daten brauche. Die Uhrzeit wäre zwar schön gewesen, aber zur Nor geht es auch ohne.

Kann es wirklich am Zeichen liegen?
Mitglied: AmVerzweifeln
AmVerzweifeln 12.03.2018 um 17:27:28 Uhr
Goto Top
PS: Habe deinen Code natürlich probiert. Selbes Ergebniss, schmiet ab.
Danke für die Mühe
Mitglied: Pedant
Pedant 12.03.2018 um 18:21:02 Uhr
Goto Top
Hallo AmVerzweifeln,

mit | verkettet man Befehle.
Bsp.:
 set ZA=16:51:43|main
Der Befehl "main" ist entweder falsch geschrieben oder konnte nicht gefunden werden.

Nimm mal | als Delimiter.
Damit das funktioniert musst Du es maskieren:
delims=^|

Tutorial zur FOR-Schleife

Gruß Frank
Mitglied: AmVerzweifeln
AmVerzweifeln 12.03.2018 um 18:34:30 Uhr
Goto Top
Hallo Pedant,

versuch ich gleich mal.

Zwichenzeitlich hätte ich da ein neues Problem.
Ich lese ab einer bestimmten Stelle die erste Spalte der Zeilen aus. Wenn in der ersten Spalte ein m steht kann ich die verarbeiten. Wenn ein anderer Buchstabe da steht, will ich die Zeile davor prüfen.
Mein Code funktioniert, wenn ich beim ersten Versuch auf ein m treffe. Wenn in der ersten Zeile ein i steht, ich die Zeile davor prüfe wo ein m steht erhalte ich immer noch das Ergebnis der ersten Zeile.

Ich lese die erste Zeile
Code FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
Prüfe ZT und wenn <> m sage ich per Goto, gehe zurück und prüfe die vorige Zeile (ZN-1)

Im Ergebniss hat er nun beide Zeilen in %%i und deshalb läuft meine Prüfung ins leere.
Gibt es so eine Art "Clear Befehl", welcher den Inhalt aus der ersten Prüfung löscht?
Mitglied: AmVerzweifeln
AmVerzweifeln 12.03.2018 um 18:40:25 Uhr
Goto Top
Hallo Pedant,

das mit dem Delimiter war ne sehr gute Idee. Damit bekomme ich jetzt auch die Uhrzeit raus.

Vielen Dank dafür
Mitglied: Pedant
Pedant 12.03.2018 um 19:07:00 Uhr
Goto Top
Hallo AmVerzweifeln,

Zitat von @AmVerzweifeln:
Wenn ein anderer Buchstabe da steht, will ich die Zeile davor prüfen.
Mein Code funktioniert, wenn ich beim ersten Versuch auf ein m treffe. Wenn in der ersten Zeile ein i steht, ich die Zeile davor prüfe wo ein m steht erhalte ich immer noch das Ergebnis der ersten Zeile.

Zitat von @AmVerzweifeln:
Ich lese die erste Zeile
Code FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
Prüfe ZT und wenn <> m sage ich per Goto, gehe zurück und prüfe die vorige Zeile (ZN-1)

if würde hier nicht mit goto arbeiten, sondern den Vorzeilenwert und den aktuellen Wert speichern und entsprechnd agieren.
 FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do  
	(
	set vorher=%ZT%
	set ZT=%%i
	if not "%ZT%"=="m" set ZT=%vorher%  
	)
Aus Deinen Beispielen geht allerdings nicht hervor wo Du eigentlich hinwillst und nur sehr dürftig wo Du eigentlich herkommst.

Zitat von @AmVerzweifeln:
Gibt es so eine Art "Clear Befehl", welcher den Inhalt aus der ersten Prüfung löscht?
set Variable=
löscht die Variable.

Wirf mal hier einem Blick drauf:
Formatierungen in den Beiträgen

Gruß Frank
Mitglied: AmVerzweifeln
AmVerzweifeln 12.03.2018 aktualisiert um 20:18:31 Uhr
Goto Top
Hallo Pedant,

wirklich nett von dir, dass du dir die Zeit nimmst mir zu helfen.

Ich fang mal von vorne an, damit du siehst wo das ganze hinführen soll.
In eine Textdatei werden fortlaufend Daten reingeschrieben. Wenn ich den aktuellen Stand erfahren will muss ich mir also den letzen Ergebniseintrag raus holen. Nicht jede Zeile ist aber eine Ergebniszeile. Ergebniszeilen werden mit einem vorstehenden m gekennzeichnet. Informationszeilen mit einem i.
Der Inhalt dieser Datei sieht wie folgt aus:
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
i 22:44:41|CUDA5 So
i 22:44:41|CUDA5 No
i 22:44:41|stratum Acc
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:42|main Sp

sind jetzt nur die ersten Zeichen, Zeilenlänge ist 232 Zeichen.

Vom Konzept her möchte ich nun die letzte Zeile auslesen, die enthaltenen Werte anzeigen und das soll jede Minute aktuallisiert werden.
Nun kann es mir passieren, dass die letzte Zeile eine "Informationsseite" ist und keine Werte beinhaltet.
In diesem Fall möchte ich X Zeilen davor gehen bis ich den letzten "m" Eintrag finde und mir dort die Werte raus holen. Das X ist dabei dynamisch. Können 3 Zeilen wie in diesem Beispiel aber auch mehr oder weniger sein.

Zu Zeit ist mein Problem, das ich dies mit
FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i
die Werte aus der letzten Zeile leinlesen kann.
Stelle ich fest dass ich in einer Informationszeile bin, reduziere ich den Zeilenzeiger um 1 und will nun Prüfen ob die Zeile davor eine Wertezeile ist, usw. bis ich die letzte Wertezeile finde.

Hier der Code den ich bisher habe:
@echo off
::---------------------------ANZAHL ZEILEN ERMITTELN---------------------------
find C:\Windows\Temp\Work.txt /c /v "" > C:\Windows\Temp\ZN.txt
FOR /F "skip=1 delims=" %%i IN (C:\Windows\Temp\ZN.txt) do Set ZN=%%i

::-----LÄNGE DES TEXT ERMITTELN-----
set /a L=0
:Loop
call set "Z=%%ZN:~%L%,1%%"
if defined Z (set /a L+=1 & goto :Loop)
echo %ZN% hat %L% Zeichen

::-----ZEILENNUMMER ERMITTELN------
set /a ZN=%ZN:~37%
echo %ZN%
set /A ZN=%ZN%-1
echo %ZN%

:ZEILE_EINLESEN
::-----ZEILE EINLESEN---------------------
set "ZT="
::-----ZEILENTYP---------------------------
FOR /F "skip=%ZN% delims=^|" %%i IN (C:\Windows\Temp\Work.txt) do echo %%i

FOR /F "tokens=1 skip=%ZN%" %%i IN (C:\Windows\Temp\Work.txt) do Set ZT=%%i

::for /f "tokens=1" %%a in ('more/e +%ZN% ^< C:\Windows\Temp\Work.txt') do (
:: if not defined line set "ZT=%%a"
:face-smile

set ZT=%ZT:~0,1%
echo Zeilentyp: %ZT%

IF /i %ZT% == m GOTO RICHTIGER_ZT
::-----ZEILENTYP <> M 1------------------
echo Zeile %ZN% Zeilentyp ist kein m
set /A ZN=%ZN%-1
echo Prüfe vorige Zeile Nr. %ZN%
set "ZT="

GOTO ZEILE_EINLESEN

:RICHTIGER_ZT
echo Zeilentyp als Klassse m identifieziert

pause


Im Ergebnis passiert nun folgendes:
1. Lauf
10474
10473
i 22:44:50
Zeilentyp: i
Zeile 10473 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10472

2. Lauf
i 22:44:50
i 22:44:50
Zeilentyp: i
Zeile 10472 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10471

3. Lauf
i 22:44:50
i 22:44:50
i 22:44:50
Zeilentyp: i
Zeile 10471 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10470

4. Lauf
m 22:44:49
i 22:44:50
i 22:44:50
i 22:44:50
Zeilentyp: i
Zeile 10470 Zeilentyp ist kein m
Pr³fe vorige Zeile Nr. 10469


Nun sollte er eigentlich das m auslesen (set ZT=%ZT:~0,1%). Da er aber immernoch alle vier Ergebnisse als ein Ergebnis speichert, findet er nur wieder ein i. Daher kamm die Frage ob ich irgendwie das Ergebnis des voherigen FOR Befehls löschen kann, ohne gleich all meine Variabln zu löschen.

Aber vieleicht verenne ich mich bei der ganzen konzeptionierung in die falsche Richtung und das lässt sich alles viel einfacher lösen.

Wäre schön wenn du ne Lösung, Anregung oder die richtige Kritik hättest.

Wenn du sonst noch infos brauchst, jederzeit gerne.

Grüße

PS: Wie bekomme ich den den Code so elegant hier abgebildet wie Du?
Mitglied: Pedant
Pedant 13.03.2018 um 11:59:02 Uhr
Goto Top
Hallo AmVerzweifeln,

Zitat von @AmVerzweifeln:
Aber vieleicht verenne ich mich bei der ganzen konzeptionierung in die falsche Richtung und das lässt sich alles viel einfacher lösen.

Wenn Dich nur die Zeilen interessieren, die mit "m " anfangen, dann solltest Du auch nur diese untersuchen, um nicht umständlich filtern zu müssen.
@echo off
for /f "tokens=1,* delims=^|" %%f in ('findstr /b "m " C:\Windows\Temp\Work.txt') do (  
	set zeilenzeit=%%f
	set zeilentext=%%g
)
set zeilenzeit=%zeilenzeit:~2%
echo Um %zeilenzeit% Uhr wurde Folgendes ausgegeben: %zeilentext%
Diese Code könnte die Aufgabe lösen, falls Uhrzeit und Inhalt der letzen m-Zeile alles ist, was Dich interessiert.

Ein paar Worte dazu:
 findstr /b "m " C:\Windows\Temp\Work.txt
Das gibt alle Zeilen aus die mit "m " beginnen.
Die Ausgabe des Befehls wird in der For-Schleife zeilenweise ausgewertet.
Getrennt wird am |.
Genutzt wird Token 1 => %%f und der Rest (Token *) => %%g
Die Variablen werden solange erneut belegt, bis die letzte Zeile ausgewertet wurde.
Nach der For-Schleife kommt die Ausgabe, wobei die Zeit zuvor noch vom führenden "m " befreit wird.

Bei mir bleibt die Frager offen was Du mit der Zeilennummer willst.
Hat das Performancegründe und Du möchtest deshalb ein skip=Zeilenanzahl nutzen oder benötigst Du die Zeilennummer in der Ausgabe?

Zitat von @AmVerzweifeln:
PS: Wie bekomme ich den den Code so elegant hier abgebildet wie Du?

Zitat von @Pedant
Wirf mal hier einem Blick drauf:
Formatierungen in den Beiträgen

Gruß Frank
Mitglied: AmVerzweifeln
AmVerzweifeln 13.03.2018 aktualisiert um 15:01:04 Uhr
Goto Top
Hallo Frank,

wenn ich ohne die Zeilennummer ein FOR ausgeführt habe, ist er mir bei großen Dateien immer abgeschmiert. Die aktuelle Datei hat 1.16 Mio. Zeilen. Daher dachte ich, dass der Umfang das Problem für das abschmieren war. Seit ich erst die Zeilennummer ermittle, hab ich das Problem nicht mehr.
Und ja die Performance ist erheblich schneller.

Der Code von dir gibt mir leider nur leere Variablen. Vor dem "m" bzw "i" sind drei Leerstellen. Das habe ich geändert, dass Ergebnis ist aber immer noch das Selbe:

Um ~2 Uhr wurde Folgendes ausgegeben:

Habe das m in allen Varianten (3 Lerrzeichen davor und eins danach, ein Leerzeichen davor und danach, ohne Leerzeichen usw) suchen lassen, immer das selbe Ergebnis.

Habe dann mir den FOR Befehl noch mal angeschaut und die Option "eol=i" ausprobiert aber das selbe Ergebnis. Wobei ich mir nicht sicher bin, wie ich bei dem eol die Leerzeichen davor richtig darstelle.


Grüße Franco
Mitglied: AmVerzweifeln
AmVerzweifeln 13.03.2018 aktualisiert um 14:26:20 Uhr
Goto Top
Habe jetzt mit eine vorherigen Versuch rumprobiert und dabei dein Model des Variablen setzen übernommen.
FOR /F "skip=%ZN% tokens=1,* delims=^|" %%f IN (C:\Windows\Temp\Work.txt) do (  
                set V_ZEIT=%%f
                set V_WERT=%%g
)

echo Zeit:%V_ZEIT%
echo Wert:%V_WERT%

Lasse den Zeilentyp prüfen und wenn der nicht m ist, leere ich die Variablen und springe ich per GOTO wieder auf obigen Code zurück.

set "V_ZEIT="  
set "V_WERT="  

GOTO ZEILE_EINLESEN

Was ich nicht verstehe:
Der Code klettert korrekt immer eine Zeile weiter zurück aber der Wert der Variablen ändert sich nicht.
In der vierten Zeile von unten ändert sich die Sekunde. Aber auch wenn ich die Schleife 20 mal durchlaufe, zeigt er mir im Ergebniss immer die gleiche Zeit als Ergebniss an. Ergo erbehält den Wert des erstens Auslesen.
Ich denke ich hab da ein Grundsätzliches Verständnisproblem. Kann ich den Auslesenpart in eine eigene Batch auslagern und mit Rückgabewerte arbeiten? Wenn ich für jede Zeile die Lese-Batch extra starte sollten die Übergabewerte dann doch nur noch die geprüfte Zeile beinhalten oder verrenne ich mich jetzt schon wieder?
Mitglied: AmVerzweifeln
AmVerzweifeln 13.03.2018 um 14:46:49 Uhr
Goto Top
Hallo Ralf,

ich denke ich hab das Problem verstanden.
In der FOR Schleife läuft er grundsätzlich von der Startzeile bis zur letzten Zeile alle Zeilen durch und übergibt damit auch jedesmal zum Schluss die Werte aus der letzten Zeile an die Variablen.

FOR /F "skip=%ZN% tokens=1,* delims=^|" %%f IN (C:\Windows\Temp\Work.txt) do (  
                set V_ZEIT=%%f
                set V_WERT=%%g
                GOTO WEITER1
)

:WEITER1

echo Zeilennummer:%ZN%
echo Zeit:%V_ZEIT%
echo Wert:%V_WERT%

Nach dem ich ihm aus der Schleife raus springen lasse, bekomme ich tatsächlich die Werte der aktuellen Zeile raus.
Das ist zwar nicht so elegant wie mit findstr aber löst ersteinmal mein Problem.
Ich bastle mal weiter.
Theoretisch ist das Problem damit gelöst. Es sei dem Du möchtest der Sache, warum das mit findst nicht funktioniert hat weiter auf den Grund gehen. Gib da mal kurz bescheid.

Vielen, vielen Dank für die Mühe die Du dir gemacht hast und für die sehr schnellen Antwortzeiten. Das hat mir sehr geholfen. Dickes Lob

Grüße Franco
Mitglied: Pedant
Lösung Pedant 13.03.2018 um 18:38:14 Uhr
Goto Top
Hallo Franco,

Zitat von @AmVerzweifeln:
Der Code von dir gibt mir leider nur leere Variablen. Vor dem "m" bzw "i" sind drei Leerstellen.
wenn Du die Spielregel änderst...

Hier eine funktionierende Variante:
@echo off
for /f "tokens=1,* delims=^|" %%f in ('findstr /r /c:"^[ ][ ][ ]m[ ]" C:\Windows\Temp\Work.txt') do (  
	set zeilenzeit=%%f
	set zeilentext=%%g
)
set zeilenzeit=%zeilenzeit:~5%
echo Um %zeilenzeit% Uhr wurde Folgendes ausgegeben: %zeilentext%

Mit Deiner (aktualisierten) Quelldatei...
<code type=plain"> m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
m 22:44:40|main Sp
i 22:44:41|CUDA5 So
i 22:44:41|CUDA5 No
i 22:44:41|stratum Acc
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:41|main Sp
m 22:44:42|main Sp

...kommt das hier raus:
Um 22:44:42 Uhr wurde Folgendes ausgegeben: main Sp

Gruß Frank

PS: Wer ist Ralf?
Mitglied: AmVerzweifeln
AmVerzweifeln 13.03.2018 um 18:50:13 Uhr
Goto Top
Hallo Frank,

Ralf kommt dabei raus, wenn gleichzeitig telefoniert und schreibt.
Ich werd das gleich morgen früh mal einbauen und geb dir bescheid.

Danke nochmal und Grüße
Mitglied: Pedant
Lösung Pedant 14.03.2018 um 12:43:59 Uhr
Goto Top
Hallo Franco,

ich habe mir mal eine "richtige" Testdatei erzeugt,
die 1.160.000 Zeilen hat und so aussieht:
   m 16:50:35|main Speed 381.22 Mh/s gpu/0 31.77 gpu/1 31.77 gpu/2 31.77 gpu/3 31.77 gpu/4 31.77 gpu/5 31.77 gpu/6 31.77 gpu/7 31.92 gpu/8 31.62 gpu/9 31.77 gpu/10 31.77 gpu/11 31.77 [A6101+88:R7+2:F0] Time: 18:37
...
   m 16:50:35|main Speed 381.22 Mh/s gpu/0 31.77 gpu/1 31.77 gpu/2 31.77 gpu/3 31.77 gpu/4 31.77 gpu/5 31.77 gpu/6 31.77 gpu/7 31.92 gpu/8 31.62 gpu/9 31.77 gpu/10 31.77 gpu/11 31.77 [A6101+88:R7+2:F0] Time: 18:37

Meine letzte Variante mit findstr funktioniert zwar, ist aber bei einer größeren Datei weit jenseits von performant.
Habe ich eine Testdatei mit 1.000 Zeilen geht es noch einigermaßen, aber bei 100.000 Zeilen dauert es schon 9 Minuten bis die Suche fertig ist.

Ich habe es jetzt mit skip und ohne findstr gemacht, also so, wie Du es im Grunde auch schon gemacht hast.
Das geht mit der großen Datei, auch auf meinem eher schwächeren Rechner, ausreichend performant.
@echo off

:config
set suchpfad=C:\Windows\Temp
set suchdatei=Work.txt

:alte_werte_loeschen
set zeilenanzahl=
set zeilenskip=
set zeilenanfang=
set zeilentyp=
set zeilenzeit=
set zeilentext=
set ausgabezeile=

:zeilenanzahl_ermitteln
find %suchpfad%\%suchdatei% /c /v "" > %suchpfad%\zeilenanzahl.txt  
for /f "tokens=3" %%i in (%suchpfad%\zeilenanzahl.txt) do (  
	set /a zeilenanzahl=%%i
)

REM echo Zeilenanzahl: %zeilenanzahl%
set /a zeilenskip=%zeilenanzahl%

:suchloop
set /a zeilenskip=%zeilenskip%-1
if %zeilenskip% lss 1 goto ende
call :zeile_untersuchen %zeilenskip%
set zeilentyp=%zeilenanfang:~3,1%
set zeilenzeit=%zeilenanfang:~5%
REM echo Zeilentyp : %zeilentyp%
REM echo Zeilenzeit: %zeilenzeit%
REM echo Zeilentext: %zeilentext%
if not "%zeilentyp%"=="m" goto suchloop  

:ausgabe
set /a ausgabezeile=%zeilenskip%+1
echo Zeile: %ausgabezeile%
echo Zeit : %zeilenzeit% Uhr
echo Text : %zeilentext%

:aufraeumen
set zeilenanzahl=
set zeilenskip=
set zeilenanfang=
set zeilentyp=
set zeilenzeit=
set zeilentext=
set ausgabezeile=
if exist %suchpfad%\zeilenanzahl.txt del %suchpfad%\zeilenanzahl.txt

:ende
exit /b

REM *** Hier endet die Batch, es folgt noch eine Funktion ***

:zeile_untersuchen
REM echo Ueberspringe %1 Zeilen
for /f "skip=%1 tokens=1,* delims=^|" %%f in (%suchpfad%\%suchdatei%) do (  
	set zeilenanfang=%%f
	set zeilentext=%%g
	exit /b
)

Die Batch ermittelt mit Deiner Methode die Zeilenanzahl und skipt bei zeile_untersuchen zur letzen Zeile.
Sollte die letzte Zeile schon ein Treffer sein, also eine Zeile vom Typ "m", dann dauert die Suche ca. 3 Sek.
Sollte die Zeile kein Treffer sein, so wird zeile_untersuchen erneut aufgerufen, aber mit einem skip weniger.
So geht der suchloop immer eine Zeile höher, bis ein Treffer erzielt wurde.
Das dauert knapp eine Sekunde pro Zeile.
Wenn Typ-m-Zeilen also keine Seltenheit sind, ist der Suchvorgang vermutlich schnell genug.

alte_werte_loeschen und aufraeumen sind eigentlich nur relevant, wenn man die Batch manuell und wiederholt in derselben Eingabeaufforderung ausführt.
Damit verhindert man, dass man noch Werte vom vorhergehenden Durchlauf in den Variabel hat und eventuell diese angezeigt bekommt und nicht versteht wo die bloß herkommen.

Gruß Frank
Mitglied: AmVerzweifeln
AmVerzweifeln 14.03.2018 um 14:14:31 Uhr
Goto Top
Hallo Frank,

nochmals vielen Dank für die Mühe die Du dir gemacht hast.
Beim ersten Versuch hat er sich tot gesucht. Habe dann Zeile 29

set zeilentyp=%zeilenanfang:~3,1%

in

set zeilentyp=%zeilenanfang:~2,1%

geändert, und siehe da: Funktioniert einwandfrei.

Ich markiere die Frage als gelöst.
Vielen, vielen Dank nochmal für die schnelle und gute Hilfe.

ohne dich wäre ich wahrscheinlich immer noch am Verzweifeln

Grüße
Mitglied: Pedant
Pedant 14.03.2018 um 14:28:25 Uhr
Goto Top
Hallo Franco,

Zitat von @AmVerzweifeln:
...in
set zeilentyp=%zeilenanfang:~2,1%
geändert, und siehe da: Funktioniert einwandfrei.

...dann hast Du die Spielregel wieder geändert,
Vor dem "m" bzw "i" sind drei Leerstellen
denn mit drei Leerzeichen müsste es mit ~3,1 funktionieren.

Aber egal, wenn's bei Dir jetzt läuft ist alles gut.

Ob Logdateien wirklich 1,16 Millionen Zeilen haben müssen, wäre noch eine andere Frage.
Man könnte sie sicher auch gelegentlich wegspeichern und neu (leer) anlegen.

Gruß Frank