Auslesen von 2 Werten aus einer Textdatei (in abhängigkeit vo suchkriterien)
Guten Abend, ich habe schon öfter hier Hilfe gefunden, da Google häufiger bei meinen Wünschen in sachen Batch administrator.de angibt.
Nun habe ich schon einige Zeit gesucht aber nicht das richtige gefunden bzw mir ist es selber nicht eingefallen, bzw nur so kompliziert, das es einfach quatsch ist diesen Ansatz weiterzuverfolgen.
Zum Probem:
Ich habe eine Textdatei und möchte dort Zeiten auslesen
die datei sieht etwa so aus:
nur kann ich z.b. mit diesem befehl die starts und mit dem 2. die stops ausgeben lassen:
Hierbei werden erst die start zeilen ausgegeben und anschließend die stop
Nur ich brauche ja die abhängigkeiten davon,
da habe ich gedacht, das ich nach event suche und dann später nach start suche, aber dies macht der befehl find bzw findstr nicht mit
desweiteren brauche ich auch noch eine abfrage, das das start das nächste am stop ist, ansonsten habe ich ja eine falsche Zeit
Und mir fällt einfach keine lösung ein, die sinnvoll wäre
bzw nur sehr aufwändig
(alle suchen lassen und in eine txt datei schreiben, auslesen alle zeiten umwandeln dann vergleichen mit den stop zeiten, und die nächsten nehmen)
da dachte ich mir das das eig auch in einer schleife zu schaffen sein müsste.
Nur an dieser stelle verlassen mich meine batch-kentnisse
Falls es da eine einfache Lösung bzw einen lösungsansatz gibt würde ich mich freuen und gerne weiterprobieren bis ich mein Ziel erreicht habe
MFG
pumi32
Nun habe ich schon einige Zeit gesucht aber nicht das richtige gefunden bzw mir ist es selber nicht eingefallen, bzw nur so kompliziert, das es einfach quatsch ist diesen Ansatz weiterzuverfolgen.
Zum Probem:
Ich habe eine Textdatei und möchte dort Zeiten auslesen
die datei sieht etwa so aus:
[12:23:56] prüfen von infos
[12:23:57] infos ok
[12:23:59] start event
[13:14:38] komisches eingabemodul
[13:18:14] stop event
[13:19:01] prüfen von infos
[13:23:59] start event
[14:14:38] Fehler!!!
[14:19:11] prüfen von infos
[14:20:38] start event
[15:38:10] stop event
[12:23:57] infos ok
[12:23:59] start event
[13:14:38] komisches eingabemodul
[13:18:14] stop event
[13:19:01] prüfen von infos
[13:23:59] start event
[14:14:38] Fehler!!!
[14:19:11] prüfen von infos
[14:20:38] start event
[15:38:10] stop event
Ich möchte ich die Zeit zwischen start und stop herausbekommen -> das Ziel
nur kann ich z.b. mit diesem befehl die starts und mit dem 2. die stops ausgeben lassen:
for /f "delims=" %%a in ('find "Start event" datei.txt') do echo %%a
for /f "delims=" %%a in ('find "stop event" datei.txt') do echo %%a
Hierbei werden erst die start zeilen ausgegeben und anschließend die stop
Nur ich brauche ja die abhängigkeiten davon,
da habe ich gedacht, das ich nach event suche und dann später nach start suche, aber dies macht der befehl find bzw findstr nicht mit
desweiteren brauche ich auch noch eine abfrage, das das start das nächste am stop ist, ansonsten habe ich ja eine falsche Zeit
Und mir fällt einfach keine lösung ein, die sinnvoll wäre
bzw nur sehr aufwändig
(alle suchen lassen und in eine txt datei schreiben, auslesen alle zeiten umwandeln dann vergleichen mit den stop zeiten, und die nächsten nehmen)
da dachte ich mir das das eig auch in einer schleife zu schaffen sein müsste.
Nur an dieser stelle verlassen mich meine batch-kentnisse
Falls es da eine einfache Lösung bzw einen lösungsansatz gibt würde ich mich freuen und gerne weiterprobieren bis ich mein Ziel erreicht habe
MFG
pumi32
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 91698
Url: https://administrator.de/contentid/91698
Ausgedruckt am: 26.11.2024 um 20:11 Uhr
9 Kommentare
Neuester Kommentar
Moin pumi32,
ich würde das von CmD-Prompt aus so abfackeln:
-oder im Batch-
Grüße
Biber
ich würde das von CmD-Prompt aus so abfackeln:
>for /f "tokens=1,2" %a in ('findstr /i "Start Stop" test.log') do @if "%b"=="start" (set "%b=%a") else @echo Start/Stop !start! %a
Start/Stop [12:23:59] [13:18:14]
Start/Stop [14:20:38] [15:38:10]
@echo off & setlocal enableDelayedExpansion
for /f "tokens=1,2" %%a in ('findstr /i "Start Stop" test.log') do (
if "%%b"=="start" (
set "%%b=%%a"
) else (
echo Start/Stop !start! %%a
))
Biber
Moin pumi32,
wenn "start" öfters vorkommt, dann wäre doch ein Filter nach " event" vielleicht sinnvoller, oder bringt das auch unerwünschte Dubletten?
Bedeutet, dass Du an Deinem CMD-Prompt noch ein "setlocal enableDelayedExpansion & " vor diese quick & dirty-Zeile oben setzen müsstest.
In dem Batchschnipsel war noch ein Prozentzeichen zuwenig (tTppfehler). habe ich oben ergänzt.
Bitte nochmal damit testen.
In der Batchversion ist es ja explizit drin, und die Zeile vom CMD-Prompt aus sollte ja nur ein proof-of-concept (neudeutsch für hingeschlampertes Antesten) sein.
Grüße
Biber
wenn "start" öfters vorkommt, dann wäre doch ein Filter nach " event" vielleicht sinnvoller, oder bringt das auch unerwünschte Dubletten?
findstr /i "event" test.log
-oder ggf-
findstr /i /C:"] st" test.log|findstr "event"
deine batch alleine geht bei mir nicht
Bei mir ist als Default unterm CMD-Prompt eingestellt "EnableDelayedExpansion". Ab Werk aber nicht.Bedeutet, dass Du an Deinem CMD-Prompt noch ein "setlocal enableDelayedExpansion & " vor diese quick & dirty-Zeile oben setzen müsstest.
In dem Batchschnipsel war noch ein Prozentzeichen zuwenig (tTppfehler). habe ich oben ergänzt.
Bitte nochmal damit testen.
In der Batchversion ist es ja explizit drin, und die Zeile vom CMD-Prompt aus sollte ja nur ein proof-of-concept (neudeutsch für hingeschlampertes Antesten) sein.
Grüße
Biber
Moin pumi32,
nun mal nicht so viele Fragen auf einmal - ich bin doch kein Lexikon...
Also, wenn Du unbedingt die weniger dokumentierten CMD-Bereiche ein bisschen erwandern willst... Du hast es so gewollt.
Dieses Konstrukt
Ich habe Deine Test.log mal um zwei "ähnliche" Zeilen erweitert:
Ziel: Die soll durchflöht werden nach "start event" und "stop event"-Einträgen.
Und nur "genau" die Zeilen mit "start event"/"stop event" finden, nicht die ähnlichen.
Nun denn, am CMD-Prompt (einzugebende Zeilen beginnen mit ">"):
...as should do....
Nachkaspern, verstehen, abgewandelt in den Batch einbauen.
Funktioniert auch meistens.
Aber: Falls unbeabsichtigt ein Leerzeichen hinter "wert" steht oder deren 3...
Dann ist der Inhalt von %Var% unbeabsichtigterweise "wert " statt "wert".
Bei Vergleichen ist das ärgerlich.
Wenn also in %meinUsername% der Inhalt "Biber " (mit trailing blank) steht..
Sondern nach Deiner Verarbeitung auch wieder dahin, wo alles begann.
Und woher kennst Du den Pfad, wo Du begonnen hast???
PushD "merkt" sich den intern...und mit einem PopD geht wieder zurück.
Das macht die Sache schon einfacher.
Grüße
Biber
nun mal nicht so viele Fragen auf einmal - ich bin doch kein Lexikon...
Also, wenn Du unbedingt die weniger dokumentierten CMD-Bereiche ein bisschen erwandern willst... Du hast es so gewollt.
Dieses Konstrukt
findstr /C:"start event" /C:"stop event"
...das geht so nicht. Aber wie folgt geht es stressarm:Ich habe Deine Test.log mal um zwei "ähnliche" Zeilen erweitert:
>type test.log
[12:23:56] prüfen von infos
[12:23:57] infos ok
[12:23:59] start event
[13:14:38] komisches eingabemodul
[13:18:14] stop event
[13:19:01] prüfen von infos
[13:23:59] start event
[14:14:38] Fehler!!!
[14:19:11] prüfen von infos
[14:20:38] start event
[15:38:10] stop event
[15:38:19] other event
[16:20:18] start noch irgendeinen event
Und nur "genau" die Zeilen mit "start event"/"stop event" finden, nicht die ähnlichen.
Nun denn, am CMD-Prompt (einzugebende Zeilen beginnen mit ">"):
>echo start event>such.lst
>echo stop event>>such.lst
>findstr /G:such.lst test.log
[12:23:59] start event
[13:18:14] stop event
[13:23:59] start event
[14:20:38] start event
[15:38:10] stop event
Nachkaspern, verstehen, abgewandelt in den Batch einbauen.
was ist der unterschied zwischen diesen variabeln:
var=wert
und diesen:
"var=wert"
Kommt darauf an. Die erste Variante ist die offiziell dokumentierte.var=wert
und diesen:
"var=wert"
Funktioniert auch meistens.
Aber: Falls unbeabsichtigt ein Leerzeichen hinter "wert" steht oder deren 3...
Dann ist der Inhalt von %Var% unbeabsichtigterweise "wert " statt "wert".
Bei Vergleichen ist das ärgerlich.
Wenn also in %meinUsername% der Inhalt "Biber " (mit trailing blank) steht..
IF /i "%meinUsername%"=="Biber" goto :ok
Den Fehler kannst Du durch die Schreibweise [Set "Var=wert"] vermeiden.PushD cd /d F:\_download, upload\
und bei ausführung von
popd ist man wieder bei der aktuellen
Ja, fast. Nochmal die Syntax-Hilfe von PushD lesen.und bei ausführung von
popd ist man wieder bei der aktuellen
Frage:
warum soll cd /d ... schlecht sein?
Weil Du ja nicht nur auf den "neuen" Pfad inkl. Laufwerk wechseln willst.warum soll cd /d ... schlecht sein?
Sondern nach Deiner Verarbeitung auch wieder dahin, wo alles begann.
Und woher kennst Du den Pfad, wo Du begonnen hast???
PushD "merkt" sich den intern...und mit einem PopD geht wieder zurück.
Das macht die Sache schon einfacher.
Grüße
Biber
Moin pumi32,
ja, der angezeigte Fehler liegt an irgendwelchen Rechenoperationen.
Und zwar werden alle Zahlenwerte, die mit "0" beginnen als Oktalzahlen interpretiert. Klappt hervorragend bei 01, 02..07.. und geht in die Grütze bei 08 und 09, die zwar als Stunden/Minuten-Angaben häufig vorkommen, aber als Oktalwerte eben gar nicht.
[Frag nicht, wer sich diesen Pfusch ausgedacht hat]
Ich kann Dir nur als Workaround anbieten:
Wenn Du mit Minuten/Stundenangaben "rechnen" willst, dann bringe die Werte auf eine drei- oder mehrstellige Zahl und ermittle danach wieder mit Modulo oder Subtraktion die ein-oder zweistelligen Werte.
Beispiel: Wenn Stundenenwert "08" kommen könnte
z.B (%starte%=08:15:00),
Grüße
Biber
ja, der angezeigte Fehler liegt an irgendwelchen Rechenoperationen.
Und zwar werden alle Zahlenwerte, die mit "0" beginnen als Oktalzahlen interpretiert. Klappt hervorragend bei 01, 02..07.. und geht in die Grütze bei 08 und 09, die zwar als Stunden/Minuten-Angaben häufig vorkommen, aber als Oktalwerte eben gar nicht.
[Frag nicht, wer sich diesen Pfusch ausgedacht hat]
Ich kann Dir nur als Workaround anbieten:
Wenn Du mit Minuten/Stundenangaben "rechnen" willst, dann bringe die Werte auf eine drei- oder mehrstellige Zahl und ermittle danach wieder mit Modulo oder Subtraktion die ein-oder zweistelligen Werte.
Beispiel: Wenn Stundenenwert "08" kommen könnte
z.B (%starte%=08:15:00),
set /a h=1%Starte:~1,2% -100
REM Varinate1 - würde "gelesen" werden als ...
REM ...Set /a h=108 -100 = 8
set /a h=10%Starte:~1,2% %% 1000
REM Variante 2 würde "gelesen" werden als ...
REM Set /a h=1008 Mod 1000 = 8
Grüße
Biber
Moin pumi32,
der Modulo-Operator (im Batch wird er eben als "%" geschrieben) liefert den Rest einer Division.
Beipiel von oben:
1008 Modulo 1000 entspricht dem Rest von 1008 geteilt durch 1000
Ganzzahliges Ergebnis von 1008 / 1000 ist 1 (was uns nicht interessiert.
Rest von (1008 / 1000) = 8 <---- den rest wollen wir wissen.
Da nun "zufällig" der Modulo-Operator das Prozentzeichen ist, welches wiederum im Batch ohnehin spezielle bedeutung hat, muss es im Batch verdoppelt werden.
Diese beiden Schreibweisen (mit/ohne Anführungszeichen) sind gleichwertig.
Im Batch macht es einen Unterschied - OHNE Anführungszeichen MUSS das %-Zeichen "maskiert"=verdoppelt werden.
Gehen wird das auch an Deinem CMD-Prompt - Dir fehlt keine Standardeinstellung.
Eine Standard-Eröffnungszeile in Batchen ist das
...wobei das "Setlocal" bewirkt, dasss die im Batch geSETzten Variablen bei Batch-Ende automatisch entsorgt werden und somit nicht andere Progrämmchen/Bätche verwirren können (Ausschliessen von Seiteneffekten).
Grüße
Biber
der Modulo-Operator (im Batch wird er eben als "%" geschrieben) liefert den Rest einer Division.
Beipiel von oben:
1008 Modulo 1000 entspricht dem Rest von 1008 geteilt durch 1000
Ganzzahliges Ergebnis von 1008 / 1000 ist 1 (was uns nicht interessiert.
Rest von (1008 / 1000) = 8 <---- den rest wollen wir wissen.
Da nun "zufällig" der Modulo-Operator das Prozentzeichen ist, welches wiederum im Batch ohnehin spezielle bedeutung hat, muss es im Batch verdoppelt werden.
--CMD-Prompt: Eingabezeilen bginnen mit ">"
>set /a zahl= 1008
1008
>set /a "zahl % 1000"
8
>set /a zahl % 1000
8
Im Batch macht es einen Unterschied - OHNE Anführungszeichen MUSS das %-Zeichen "maskiert"=verdoppelt werden.
:: im batch
set /a zahl= 1008
set /a derRest="zahl % 1000"
-- oder ohne Anfü-zeichen-
set /a derRest=zahl %% 1000
@echo %derRest%
Gehen wird das auch an Deinem CMD-Prompt - Dir fehlt keine Standardeinstellung.
Eine Standard-Eröffnungszeile in Batchen ist das
@echo off & setlocal
Grüße
Biber