pumi32
Goto Top

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:
[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
back-to-topIch möchte ich die Zeit zwischen start und stop herausbekommen -> das Ziel face-smile

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 face-sad

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

Content-Key: 91698

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

Ausgedruckt am: 28.03.2024 um 20:03 Uhr

Mitglied: Biber
Biber 09.07.2008 um 22:15:09 Uhr
Goto Top
Moin pumi32,

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]
-oder im Batch-
@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
))
Grüße
Biber
Mitglied: pumi32
pumi32 09.07.2008 um 23:21:05 Uhr
Goto Top
danke für die idee, ich muß erstmal die ganzen funktionen durchgehen und auf meine bedürfnisse dann umstellen
und es ist echt schnell, sowas wundert mich wirklich (bei emailanfragen warte ich generell immer 1-2 tage ;)
super support!
danke Biber

melde mich vll erst morgen

edit:
das script nimmt jeden start und stop befehl, und das ist ein problem, da es öfter vorkommt, das start vorkommt
also müsste man es eingrenzen:
findstr /C:"start event" /C:"stop event"   
würde soetwas funktionieren?


ps: deine batch alleine geht bei mir nicht (WinXP pro SP2)
ergebnis:
Start/Stop !start! [13:18:14]
Start/Stop !start! [15:38:10]
bei ändern von !start! in %start% kommen beisesmal [14:20:38] als start

OK jetzt geht sie^

edit2:
so wieder da

Und leider ist es so das ich wirklich nach "start event" suchen muß, da es öfer vorkommt das event und auch start vorkommt

ich werde erstmal testen und dann gucken was ich so hinbekomme, dann kann ich vll genauer fragen

So:
das script geht jetzt per batch (komandozeile is weniger wichtig ;)
Mitglied: Biber
Biber 10.07.2008 um 08:01:04 Uhr
Goto Top
Moin pumi32,

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
Mitglied: pumi32
pumi32 11.07.2008, aktualisiert am 18.10.2012 um 18:35:58 Uhr
Goto Top
Ich habe jetzt ein wenig getestet und meine "zu durchsuchende Datei" nochmal genau angeguckt und da ist mir aufgefallen, das es mit der suchmatrix "..." geht face-smile
Und diese: findstr /C:"] S" test.log^|findstr "event"

Allerdings frage ich mich ob man auch nach mehr suchen kann, also z.b. nach
"starte event"
-> gleichzeitig aber auch nach
"stop event"
->dies als kompletten Wert, wie ich das mit:
findstr /C:"start event" /C:"stop event"
zeigen wollte
das er also nach "start event" sucht und nich nach start und event


zum verständnis der variabeln (aus dem #comment-346404/ Mit Batch Datei 2 bestimmte Zeilen aus .ini verändern - thread):
WoW Biber, wenn man das so ließt weiß ich wie wenig ich eig über Batch weiß:
darum meine Frage:
was ist der unterschied zwischen diesen variabeln:
var=wert
und diesen:
"var=wert"
?

desweiteren habe ich auch noch vor
CD \pfad\nocheinpfad
in meinem batch einzusetzen, weil sich dort die dateien für mein batch befinden
da aus dem gleichen thread dies auch schlecht zu sein scheint (von der programierung und auch beim schreiben von logs denk ich mal)
würde ich sagen das man den gleichen befehl dann so schreiben müsste?:
PushD cd /d F:\_download, upload\
und bei ausführung von
popd ist man wieder bei der aktuellen

Frage:
warum soll cd /d ... schlecht sein?
Mitglied: Biber
Biber 11.07.2008 um 18:50:03 Uhr
Goto Top
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
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
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 ">"):
>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
...as should do....
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.
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.

Frage:
warum soll cd /d ... schlecht sein?
Weil Du ja nicht nur auf den "neuen" Pfad inkl. Laufwerk wechseln willst.
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
Mitglied: pumi32
pumi32 12.07.2008 um 13:13:16 Uhr
Goto Top
So habe jetzt mal ein wenig weitergearbeitet und diese batch habe ich nun:
Ein paar fehler sind noch bei der ausführung aufgetaucht (ich vermute, es liegt an irgentwelchen rechenoperationen):
Ein auszug der ausgeführten batch:
Downloadzeit: 1 h 42 Min 8 Sec
Geschwindigkeit von 01:18:44 bis 2:60:52 betrõgt: 16,71 kiB/s

starte 03:09:41
Start: 03:09:41
stope: 04:59:59
Stop : 04:59:59
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.
Downloadzeit: 1 h 42 Min 18 Sec
Geschwindigkeit von 03:09:41 bis 04:59:59 betrõgt: 16,68 kiB/s

starte 05:00:48
Start: 05:00:48
stope: 06:50:53
Stop : 06:50:53
Downloadzeit: 1 h 50 Min 5 Sec
Geschwindigkeit von 05:00:48 bis 06:50:53 betrõgt: 15,50 kiB/s
Hier die ÜBERAREITETE Batch (leider noch nicht alle Fehler weg)
@echo off & setlocal enableDelayedExpansion
Title RSD Log Auswertung
PUSHD F:\_download, upload\RSD\
set log=F:\log.log
:: POPD zum zurückspringen
Echo Auswertung des Logs...
for %%h in (*.txt) do (
Echo. >>!log!
Echo %%h: >>!log!
Echo. >>!log!
Echo. >>!log!
for /f "tokens=1,2" %%a in ('findstr /C:"] S" "%%h"^|findstr "Download"') do (  
        if "%%b"=="Starte" (  
          set "%%b=%%a"  
		  ) else (
set /a h=!Starte:~1,2!
set /a m=!Starte:~4,2!
set /a s=!Starte:~7,2!
		  set Stop=%%a
set /a h2=!Stop:~1,2!
set /a m2=!Stop:~4,2!
set /a s2=!Stop:~7,2!
	echo starte !Starte:~1,8! >>!log!
	echo Start: !h!:!m!:!s! >>!log!
	echo stope: !Stop:~1,8! >>!log!
	echo Stop : !h2!:!m2!:!s2! >>!log!

if !h2! LSS !h! (set /a h2=h2+24)
if !s2! LSS !s! (set /a m2=m2-1 & set /a s2=s2+60)
if !m2! LSS !m! (set /a h2=h2-1 & set /a m2=m2+60)
set /a h3=!h2!-!h!
set /a m3=!m2!-!m!
set /a s3=!s2!-!s!

if !h3!==0 (
set Dauer=!m3! Min !%s3! Sec
if !m3!==0 (set Dauer=!s3! Sec)
) else (if !m3!==0 (set Dauer=!h3! h !s3! Sec) else (set Dauer=!h3! h !m3! Min !s3! Sec))
set /a sm=!m3!*60
set /a sh=!h3!*3600
set /a sges=!s3!+!sm!+!sh!
set /a dz=10240000/!sges!
set dz=!dz:~,2!,!dz:~2,3!
	Echo Downloadzeit: !Dauer! >>!log!
	Echo Geschwindigkeit von !h!:!m!:!s! bis !h2!:!m2!:!s2! beträgt: !dz! KiB/s >>!log!
	echo. >>!log!
)))
pause
:: Alternative suche:
::1 findstr /C:"..." "%%h" 
::2 echo Starte Download>such.lst
::2 echo Schließe Download ab>>such.lst
::2 findstr /G:such.lst "%%h" 
Mitglied: Biber
Biber 14.07.2008 um 07:20:25 Uhr
Goto Top
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),
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
Mitglied: pumi32
pumi32 15.07.2008 um 00:29:26 Uhr
Goto Top
danke für die aufklärung face-smile
mich hat auch gewundert, warum das nicht bei allen zahlen vorkommt

ich hatte mir solch eine lösung überlegt:
ich frage mit einer if anfrage ab ob sich an der 1. stelle eine 0 befindet und wenn ja dann nimm nur die 2. (bsp):
if !Starte:~1,1!=0  (set /a h=!Starte:~2,1!) else (set /a h=!Starte:~1,2!)
aber deins scheint programcode einzusparen;)
und das find ich immer gut face-smile - also werde ich deine nehmen (meine aber mal testen und gucken ob es einen geschwindigkeitsunterschied gibt ^^

ps allerdings verstehe ich variante 2 nicht
was ist gemeit mit mod, kenn ich nicht?
(und es geht nicht in meinem cmdline version (vermutlich wegen den fehlenden @setlocal etc)
-> wie kann man das standartmäißg einstellen, bzw wichtigere frage was ist der nachteil wenn man es standartmäßig einstellt?
es wäre nett wenn du mir dies auch erklären könntest
Mitglied: Biber
Biber 15.07.2008 um 10:19:01 Uhr
Goto Top
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.
--CMD-Prompt: Eingabezeilen bginnen mit ">"  
>set /a zahl= 1008
1008
>set /a "zahl % 1000"  
8
>set /a zahl % 1000
8
Diese beiden Schreibweisen (mit/ohne Anführungszeichen) sind gleichwertig.

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
...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