kleineschaufel
Goto Top

Nach Wörtern in Datei suchen, die nächsten 4 Zeilen speichern und mit den Werten rechnen.

Hallo, ich bin neu hier und versuche mir hier einige tricks und kniffe anzueignen face-smile

Hallo, ich hoffe ihr könnt mir weiterhelfen...

Also ich habe eine Datei "C:\test.html" in dieser Datei ist eine html-tabelle. Nun möchte ich gerne nach Werten suchen. Z.B. nach "Zeitwert1" das mache ich wie folgt:
findstr /n /c:"Zeitwert1" "C:\test.html"  

das ergebnis ist dann z.B. so:
190:Zeitwert1<TD>
400:Zeitwert1<TD>
610:Zeitwert1<TD>

Nun brauch ich aber immer noch 2 Werte zu jeder Zeile unzwar, wenn "Zeitwert1" in Zeile 190 gefunden wurde, brauche ich den Wert der in Zeile 192 und 194 steht.
Da sind dann 2 Zahlenwerte die ich von einander subtrahieren muss. Die Zeilen sehen so aus:
192: "20:06:21</TD>"
194: "20:06:27</TD>"
Also müsste das "</TD>" auch noch entfernt werden.

Zu guter letzt würde ich das ergebnis in eine neue HTML datei schreiben lassen.
Ist mein vorhaben überhaupt mit batch möglich?

MfG
patrick

Content-Key: 153367

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

Printed on: April 25, 2024 at 12:04 o'clock

Member: bastla
bastla Oct 19, 2010 at 11:32:05 (UTC)
Goto Top
Hallo kleineschaufel und willkommen im Forum!
Ist mein vorhaben überhaupt mit batch möglich?
Möglich ja ("... alles außer Brotschneiden ..." face-wink), sinnvoller (nicht zuletzt wegen der Zeitberechnung) aber per zB VBScript ...

[Edit] ... das (korrekten Inhalt der "test.html"-Datei voraussetzend) etwa so aussehen könnte (die Ausgabe beschränkt sich mangels Beschreibung der gewünschten HTML-Datei auf die reinen Zeitdifferenzen):
Datei = "C:\test.html"  
Such = "Zeitwert1"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Zeilen = Split(fso.OpenTextFile(Datei).ReadAll, vbCrLf)'alle Zeilen in Array einlesen  
MaxZeilen = UBound(Zeilen) 'höchsten Array-Index ermitteln  
For i = 0 To MaxZeilen 'alle Zeilen des Array durchgehen  
    If InStr(Zeilen(i), Such) > 0 Then 'Suchbegriff in Zeile enthalten?  
        If i + 4 <= MaxZeilen Then 'Gibt es noch genügend Zeilen, um Zeit2 auslesen zu können?  
            'Zeile anhand "<" zerlegen, im Teil vor dem ersten "<"  
            'Anführungszeichen eliminieren und einen in einen Zeitwert umwandeln  
            Zeit1 = CDate(Replace(Split(Zeilen(i + 2), "<")(0), """", ""))  
            Zeit2 = CDate(Replace(Split(Zeilen(i + 4), "<")(0), """", ""))  
            Diff = Zeit2 - Zeit1 'Differenz der beiden Zeiten ermitteln  
            If Diff < 0 Then Diff = Diff + 1 'Tageswechsel ausgleichen  
            'Zeitdifferenz (mit Zeilenumbruch vorweg) formatiert der Ausgabe hinzufügen  
            Ausgabe = Ausgabe & vbCrLf & FormatDateTime(Diff, vbLongTime)
        End If
    End If
Next
WScript.Echo Mid(Ausgabe, 3) 'Ausgabe ohne ersten Zeilenumbruch (=Leerzeile) anzeigen  
[/Edit]
Grüße
bastla
Member: Friemler
Friemler Oct 19, 2010 at 15:44:09 (UTC)
Goto Top
Hallo Patrick,

Zitat von @bastla:
... sinnvoller (nicht zuletzt wegen der Zeitberechnung) aber per zB VBScript ...

ich probiere es mal mit einem Mix aus Batch und VBScript.

@echo off

setlocal


set "SearchFile=C:\test.html"  
set "VBSCode=%TEMP%\TimeDiff.vbs"  

(echo Set listArgs=WScript.Arguments
 echo If listArgs.Count = 2 Then
 echo   WScript.Quit DateDiff^("s",listArgs^(0^),listArgs^(1^)^)  
 echo Else
 echo   WScript.Quit 0
 echo End If
) > "%VBSCode%"  

for /f "delims=:" %%n in ('findstr /n /c:"Zeitwert1" "%SearchFile%"') do (  
  set /a "lineNumber1=%%n+1"  
  set /a "lineNumber2=%%n+3"  
  call :ProcessLine
)

del "%VBSCode%"  

exit /b


:ProcessLine
  for /f "delims=< " %%a in ('more +%lineNumber1% "%SearchFile%"') do (  
    set "timestamp1=%%a"  
    goto NextLine
  )

  :NextLine
  for /f "delims=< " %%a in ('more +%lineNumber2% "%SearchFile%"') do (  
    set "timestamp2=%%a"  
    goto Output
  )

  :Output
  cscript /nologo "%VBSCode%" "%timestamp1:~1%" "%timestamp2:~1%"  
  echo Zeitdifferenz: %ERRORLEVEL%s
exit /b

In den Zeilen 9-15 wird ein temporäres VBScript erzeugt, das die Zeitdifferenz zwischen zwei als Parametern übergebenen Uhrzeiten in Sekunden berechnen kann und das Ergebnis an das aufrufende Batchfile zurück gibt. Im Batchfile ist dieses Ergebnis über die Variable ERRORLEVEL erreichbar.

In der FOR-Schleife in Zeile 17-21 wird nach dem String "Zeitwert1" gesucht. Die Nummer der Zeile steht in der Laufvariablen %%n. Daraus wird die Anzahl Zeilen errechnet, die beim Auslesen von Uhrzeit 1 und Uhrzeit 2 vom Anfang von test.html aus übersprungen werden müssen, um als erste Zeile genau die Zeile mit der entsprechenden Uhrzeit auszugeben.

Das Auslesen wird im Unterprogramm ProcessLine erledigt. MORE +X "Dateiname" ließt die Datei "Dateiname" aus und überspringt dabei X Zeilen vom Anfang der Datei. Die Laufvariable %%a der beiden FOR-Schleifen enthält die gewünschte Uhrzeit mit einem vorangestellten Anführungszeichen. Nach dem ersten Durchlauf der FOR-Schleife (also nach dem Verarbeiten der ersten Ausgabe-Zeile) wird durch die GOTO-Befehle in Zeile 31 bzw. 37 die Schleife abgebrochen.

Beim Aufruf des VBScripts werden die Uhrzeit-Strings erst ab dem 2. Zeichen (Offset 1) bis zu ihrem Ende übergeben (wegen dem vorangestellten Anführungszeichen).

Voraussetzung für eine korrekte Funktion ist, das der angegebene Aufbau der Zeilen mit den Uhrzeiten in test.html stimmt.

[Edit]
Mist, schon wieder zu langsam face-wink

Gruß
Friemler
Member: bastla
bastla Oct 19, 2010 at 15:50:00 (UTC)
Goto Top
Hallo Friemler!

Da ich mich nicht traue, meine Batches aus Schleifen springen zu lassen (auch wenn's Performancevorteile bringt), würde ich die Zeilen 29 bis 32 durch
set "timestamp1="  
for /f "delims=< " %%a in ('more +%lineNumber1% "%SearchFile%"') do if not defined timestamp1 set "timestamp1=%%a"  
ersetzen oder alternativ ein "findstr" für die gesuchte Zeilennummer durchführen ...

Grüße
bastla
Member: Friemler
Friemler Oct 19, 2010 at 15:52:09 (UTC)
Goto Top
[OT]
Hallo bastla,

was könnte denn bei meiner Lösung passieren?

Gruß
Friemler
[/OT]
Member: bastla
bastla Oct 19, 2010 at 15:55:05 (UTC)
Goto Top
Hallo Friemler!
was könnte denn bei meiner Lösung passieren?
Genau das ist mein Problem: ich weiß es nicht ... face-sad

Grüße
bastla

P.S.: Als Optimierung würde sich für Zeile 41 (im Vertrauen auf das am Anfang der Variablen stehende Anführungszeichen)
cscript /nologo "%VBSCode%" %timestamp1%" %timestamp2%"
anbieten ...
Member: Friemler
Friemler Oct 19, 2010 at 16:00:08 (UTC)
Goto Top
Hallo Bastla,

Zitat von @bastla:
P.S.: Als Optimierung würde sich für Zeile 41 (im Vertrauen auf das am Anfang der Variablen stehende
Anführungszeichen) ... anbieten

Pfennigfuchser face-wink

Gruß
Friemler
Member: bastla
bastla Oct 19, 2010 at 16:17:09 (UTC)
Goto Top
[OT]
Hallo Friemler!
Pfennigfuchser face-wink
... auch dem Begriff "Spielkind" könnte ich nicht glaubhaft widersprechen face-wink

Grüße
bastla
[/OT]
Member: kleineschaufel
kleineschaufel Oct 20, 2010 at 07:31:14 (UTC)
Goto Top
Hui face-smile
Da habt ihr ja nen ganz schönes ding rausgehaun...damit kann ich gut weiterarbeiten face-smile
Ihr habt meinen Tag gerettet ;)
vielendank face-smile