Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Batch & Shell

Mitglied: kleineschaufel

kleineschaufel (Level 1) - Jetzt verbinden

19.10.2010 um 13:21 Uhr, 3593 Aufrufe, 8 Kommentare

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

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:
01.
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?

Mit freundlichen Grüßen
patrick
Mitglied: bastla
19.10.2010 um 13:32 Uhr
Hallo kleineschaufel und willkommen im Forum!
Ist mein vorhaben überhaupt mit batch möglich?
Möglich ja ("... alles außer Brotschneiden ..." ), 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):
01.
Datei = "C:\test.html" 
02.
Such = "Zeitwert1" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
Zeilen = Split(fso.OpenTextFile(Datei).ReadAll, vbCrLf)'alle Zeilen in Array einlesen 
06.
MaxZeilen = UBound(Zeilen) 'höchsten Array-Index ermitteln 
07.
For i = 0 To MaxZeilen 'alle Zeilen des Array durchgehen 
08.
    If InStr(Zeilen(i), Such) > 0 Then 'Suchbegriff in Zeile enthalten? 
09.
        If i + 4 <= MaxZeilen Then 'Gibt es noch genügend Zeilen, um Zeit2 auslesen zu können? 
10.
            'Zeile anhand "<" zerlegen, im Teil vor dem ersten "<" 
11.
            'Anführungszeichen eliminieren und einen in einen Zeitwert umwandeln 
12.
            Zeit1 = CDate(Replace(Split(Zeilen(i + 2), "<")(0), """", "")) 
13.
            Zeit2 = CDate(Replace(Split(Zeilen(i + 4), "<")(0), """", "")) 
14.
            Diff = Zeit2 - Zeit1 'Differenz der beiden Zeiten ermitteln 
15.
            If Diff < 0 Then Diff = Diff + 1 'Tageswechsel ausgleichen 
16.
            'Zeitdifferenz (mit Zeilenumbruch vorweg) formatiert der Ausgabe hinzufügen 
17.
            Ausgabe = Ausgabe & vbCrLf & FormatDateTime(Diff, vbLongTime) 
18.
        End If 
19.
    End If 
20.
Next 
21.
WScript.Echo Mid(Ausgabe, 3) 'Ausgabe ohne ersten Zeilenumbruch (=Leerzeile) anzeigen
[/Edit]
Grüße
bastla
Bitte warten ..
Mitglied: Friemler
19.10.2010 um 17:44 Uhr
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.

01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
 
06.
set "SearchFile=C:\test.html" 
07.
set "VBSCode=%TEMP%\TimeDiff.vbs" 
08.
 
09.
(echo Set listArgs=WScript.Arguments 
10.
 echo If listArgs.Count = 2 Then 
11.
 echo   WScript.Quit DateDiff^("s",listArgs^(0^),listArgs^(1^)^) 
12.
 echo Else 
13.
 echo   WScript.Quit 0 
14.
 echo End If 
15.
) > "%VBSCode%" 
16.
 
17.
for /f "delims=:" %%n in ('findstr /n /c:"Zeitwert1" "%SearchFile%"') do ( 
18.
  set /a "lineNumber1=%%n+1" 
19.
  set /a "lineNumber2=%%n+3" 
20.
  call :ProcessLine 
21.
22.
 
23.
del "%VBSCode%" 
24.
 
25.
exit /b 
26.
 
27.
 
28.
:ProcessLine 
29.
  for /f "delims=< " %%a in ('more +%lineNumber1% "%SearchFile%"') do ( 
30.
    set "timestamp1=%%a" 
31.
    goto NextLine 
32.
33.
 
34.
  :NextLine 
35.
  for /f "delims=< " %%a in ('more +%lineNumber2% "%SearchFile%"') do ( 
36.
    set "timestamp2=%%a" 
37.
    goto Output 
38.
39.
 
40.
  :Output 
41.
  cscript /nologo "%VBSCode%" "%timestamp1:~1%" "%timestamp2:~1%" 
42.
  echo Zeitdifferenz: %ERRORLEVEL%s 
43.
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

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
19.10.2010 um 17:50 Uhr
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
01.
set "timestamp1=" 
02.
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
Bitte warten ..
Mitglied: Friemler
19.10.2010 um 17:52 Uhr
[OT]
Hallo bastla,

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

Gruß
Friemler
[/OT]
Bitte warten ..
Mitglied: bastla
19.10.2010 um 17:55 Uhr
Hallo Friemler!
was könnte denn bei meiner Lösung passieren?
Genau das ist mein Problem: ich weiß es nicht ...

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 ...
Bitte warten ..
Mitglied: Friemler
19.10.2010 um 18:00 Uhr
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

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
19.10.2010 um 18:17 Uhr
[OT]
Hallo Friemler!
Pfennigfuchser
... auch dem Begriff "Spielkind" könnte ich nicht glaubhaft widersprechen

Grüße
bastla
[/OT]
Bitte warten ..
Mitglied: kleineschaufel
20.10.2010 um 09:31 Uhr
Hui
Da habt ihr ja nen ganz schönes ding rausgehaun...damit kann ich gut weiterarbeiten
Ihr habt meinen Tag gerettet ;)
vielendank
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Wert in einer TXT Datei suchen (11)

Frage von nolle99 zum Thema Batch & Shell ...

Batch & Shell
Wert in Registry suchen und in Variable speichern (2)

Frage von J.Troll zum Thema Batch & Shell ...

Batch & Shell
gelöst Einzelne Zeilen in txt Datei speichern und auslesen (7)

Frage von noah1400 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...