Hallo zusammen,
für ein Projekt muss ich täglich eine Protokolldatei diverser Server auslesen.
Mittlerweile funktioniert es auch recht schön und es gibt eine gesonderte, automatisch erstellte Textdatei in der alle Errors gelistet werden.
Nun folgendes: In dieser Datei sind auch bestimmte ‚Fehler‘ enthalten die man vernachlässigen kann bzw. solche die man einfach ignorieren kann. Leider kann man den Servern schlecht sagen, dass diese Fehler ‚egal‘ sind.
Mittlerweile haben sie auch einen sehr großen Anteil angenommen.
=========
Von daher ist folgendes gefragt:
Ein VBS-Code der durch Ausführen die Textdatei „eventlog.txt“ komplett ausliest und sie dabei nach einem vorgegebenen Schema durchsucht.
Gesucht werden soll nach IDs. Vorgabe wäre also z.B. „ID 3005“
In jeder Zeile, in der der Suchstring gefunden wurde, soll sie dann dafür sorgen, dass sowohl die Zeile selbst, wie auch die 3 Zeilen darüber und die 2 Zeilen darunter. Insgesamt sollen also pro gefundener Vorgabe 6 Zeilen gelöscht werden.
Kurzum:
- komplettes Dokument durchsuchen
- alle Zeilen in denen eine bestimmte ID auftaucht löschen sowie die 3 Zeilen darüber und zwei darunter
=========
Ein Beispieleintrag sieht so aus ( fett markiert wonach gesucht werden soll):
[123456] Server Servername
Type: ERROR
Computer: Computername
Time: 24.11.2008 12:10:52 ID: 3005
User: XXX\Domain
Computername.Domain.com [email protected] Usertyp
[MOD] - Hinweis auf VBS nachgetragen
Hallo,
die Zeilen, die Du suchen möchtest zu finden ist kein Problem, können wir schreiben, wenn Du möchtest.
Zeilen aus einem Textdukument ‚entfernen‘ geht so aber nicht.
Was möglich wäre: Das Dokument lesen, den Inhalt bearbeiten und neu schreiben.
Aber aus dem bestehenden Dokument Zeilen löschen ist mit VB nicht möglich.
Gruß Rainer
Wäre super - vielen Dank!
Ob die alte Datei weiterexistiert oder nicht ist prinzipiell egal - würde auch reichen wenn quasi der ganze Rest (alles wo die ID nicht auftaucht +Z drüber +2Z drunter) nicht in die Textdatei kopiert wird bzw. eben eine neue erzeugt wird in der diese NICHT mit eingefügt werden.
Je nachdem wie ‚gut‘ sich die User nämlich anstellen sind über 90% der Textdatei irrelevant - stört aber schon den Lesefluß + verlängert unnötig die Dauer für die weitere Nutzung.
Lieben Gruß,
Tim
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hi Tim,
mal schnell aus dem Boden gestampft, nicht gestestet!
Du solltest unbedingt Deine Logdatei erst mal in ein Testverzeichnis kopieren und dort das Programm testen! Das erspart mir, erst eine entsprechende Datei zu erzeugen und damit zu testen.
Wenn ich nichts falsch gemacht habe, soll das so funktionieren.
Ich habe absichtlich eine etwas langsamere Variante gewählt. Es würde auch schneller gehen, aber so ist es dem Programm völlig egal, wie lang Dein Logfile ist, es funktioniert auch mit sehr großen Files noch ohne Probleme.
Gruß Rainer
PS. Falls Du schon gelesen hattest, ich habe eine kleine Änderung eingefügt, mir war ein Fehler aufgefallen.
Private Sub Form\_Load()
Dim Src As String, Dest As String
Dim ff1 As Integer, ff2 As Integer
Dim Zl As String
Dim Mem1 As String, Mem2 As String
Dim i As Integer
Dim EF As Boolean
Pfad = "C:\" ' "" Then
Print #ff2, Mem2
End If
Mem2 = Mem1
Mem1 = Zl
Else
For i = 1 To 6
If EOF(ff1) Then
EF = True
Exit Do
End If
Mem2 = Mem1
Mem1 = Zl
Line Input #ff1, Zl
Next
End If
Loop
If EF = False Then
Print #ff2, Mem2
Print #ff2, Mem1
End If
Close #ff2
Close #ff1
Kill Src
Name Dest As Src
End Sub
Gesucht werden soll nach IDs. Vorgabe wäre also z.B. „ID 3005“
- komplettes Dokument durchsuchen
- alle Zeilen in denen eine bestimmte ID auftaucht löschen
sowie die 3 Zeilen darüber und zwei darunter
Hi Nex,
Fehler kommt wenn Suchstring schon in 4ter zeile.
Wenn das möglich ist muß man „Von“ noch auf 0 überprüfen.
Private Sub Form\_Load()
Dim Src As String, Pos As Long, ff As Integer, Satz As String
Dim Anf As Long, S, N As Long, Von As Long, Bis As Long
Const Pfad As String = "H:\" 'Anpassen
Src = Pfad & "Wahl.txt" 'Anpassen
ff = FreeFile
Open Src For Input As #ff
While Not EOF(ff)
Line Input #ff, S
Satz = Satz & S & vbCrLf
Wend
Close #ff
Satz = Left(Satz, Len(Satz) - 2)
While InStr(Pos + 1, Satz, "ID: 3005") \> 0
Pos = InStr(Pos + 1, Satz, "ID: 3005")
Von = InStrRev(Satz, vbCrLf, Pos)
Von = InStrRev(Satz, vbCrLf, Von - 1)
Von = InStrRev(Satz, vbCrLf, Von - 1)
Von = InStrRev(Satz, vbCrLf, Von - 1)
Bis = InStr(Pos, Satz, vbCrLf)
Bis = InStr(Bis + 1, Satz, vbCrLf)
Bis = InStr(Bis + 1, Satz, vbCrLf)
Satz = Left(Satz, Von - 1) & Mid(Satz, Bis + 1)
Wend
S = Split(Satz, vbCrLf)
Open Src For Output As #ff
For N = 0 To UBound(S)
Print #ff, S(N)
Next N
Close #ff
End Sub
Gruß
Reinhard
Hallo Reinhard,
Vorsicht! Logfiles können lang sein, sehr lang.
Du liest das ganze File in den Speicher. Ist das logfile zu groß, stürzt das Programm mit Out of Memory ab. 
Deshalb habe ich immer nur drei Zeilen im Speicher und schreibe die immer gleich weg.
Gruß Rainer
Hallo Rainer,
erst einmal vielen Dank für die mühe!
Habe das ganze jetzt mal in einem Testfolder probiert mit der Originaldatei.
Erhalte folgende Fehlermeldung:
„Windows Script Host“
Script: C:\Testfolder\text.vbs
Line: 2
Char: 13
Error: Expected end of statement
Code: 800A0401
Source: Microsoft VBScript compilation error
Habe das ganze in a) Privatem Folder auf dem Desktop und b) direkt auf C:\ probiert. Eingeloggt bin ich mit Adminrechten (keine lokalen).
Bei Pfad habe ich im letzten Fall „C:\Testfolder“ eingetragen.
lG
Tim
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hi Tim,
Erhalte folgende Fehlermeldung:
„Windows Script Host“
Script: C:\Testfolder\text.vbs
Line: 2
Char: 13
Error: Expected end of statement
Code: 800A0401
Source: Microsoft VBScript compilation error
sicher. Du hattest nach VB-Code gefragt, der Code ist für VB5/VB6 oder VBA. Von VBS hast Du nichts gesagt. Das nach VBS umzustricken dauert bei mir länger, da bin ich nicht so fit.
Ich trage in der Titelzeile Deiner frage mal VBS nach.
Gruß Rainer
Ah sry - vielen Dank!
Muss ehrlich gestehen, dass ich was Programmierung angeht in der Richtung nur sehr wenig Erfahrung habe bisher - daher nicht drüber nachgedacht 
Sry wegen der Umstände - werde mal sehen ob ich evtl. etwas finde um das ganze auch mit VB ans laufen zu bringen - wobei VBS natürlich wesentlich praktischer wäre.
Also vielen Dank nochmal!
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Vorsicht! Logfiles können lang sein, sehr lang.
Du liest das ganze File in den Speicher. Ist das logfile zu
groß, stürzt das Programm mit Out of Memory ab. 
Deshalb habe ich immer nur drei Zeilen im Speicher und
schreibe die immer gleich weg.
Hallo Rainer,
ja, ich habe gelesen was du geschrieben hast, dachte da, du meinst evtl. Maximalgrößen, 64 KB o.ä. wenn man die Datei komplett auf einen Rutsch, also nicht Zeilenweise einliest.
Gruß
Reinhard
Hallo Reinhard,
ja, ich habe gelesen was du geschrieben hast, dachte da, du
meinst evtl. Maximalgrößen, 64 KB o.ä. wenn man die Datei
komplett auf einen Rutsch, also nicht Zeilenweise einliest.
nein.
Logfiles können sehr groß werden. So groß, daß es schwierig wird die noch zu löschen.
Gruß Rainer
VB Riesengroße Dateien handeln
ja, ich habe gelesen was du geschrieben hast, dachte da, du
meinst evtl. Maximalgrößen, 64 KB o.ä. wenn man die Datei
komplett auf einen Rutsch, also nicht Zeilenweise einliest.
nein.
Logfiles können sehr groß werden. So groß, daß es
schwierig wird die noch zu löschen.
Hallo Rainer,
über welche Größenordnungen redest du ?
Wenn das Betriebssystem die Erstellung einer 500 GB großen Datei zuläßt, muß es doch auch in der Lage sein, diese Datei wieder zu löschen *find*
Schick mir mal eine Beispieldatei *Wehe du machst das
)*
Gruß
Reinhard
Hallo Reinhard,
über welche Größenordnungen redest du ?
das weiß ich noch nicht mal.
Wenn das Betriebssystem die Erstellung einer 500 GB großen
Datei zuläßt, muß es doch auch in der Lage sein, diese Datei
wieder zu löschen *find*
Schick mir mal eine Beispieldatei *Wehe du machst das
)*
das wäre auch schwierig, das ist mir auf meinem Unix Server passiert. (SCO Open Server 5.0)
Keine Ahnung, wie goß die Datei wirklich war. Ich weiß nur noch, daß ich das Verzeichnis mit Inhalt gelöscht habe, das ging dann. Die Datei selbst löschen hat nicht funktioniert, da habe ich nur Fehlermeldungen bekommen.
Gruß Rainer
VBS Fehlermeldung auswerten
Hallo Rainer,
okay, Dateigröße ist abgehakt. 
Mal angenommen, der Anfrager hat deinen VB-Code in eine VBS-Datei geschrieben und diese gestartet.
Dann steht da in der VBS-datei:
Private Sub Form_Load()
Dim Src As String, Dest As String
Dim ff1 As Integer, ff2 As Integer
Dim Zl As String
Dim Mem1 As String, Mem2 As String
Dim i As Integer
Dim EF As Boolean
Jetzt kommt da wohl die Fehlermeldung:
Script: C:\Testfolder\text.vbs
Line: 2
Char: 13
Error: Expected end of statement
Code: 800A0401
Source: Microsoft VBScript compilation error
Ich lese daraus, in Zeile 2, 13ter Buchstabe ist ein Fehler, Ende der Codezeile wurde erwartet.
Oder irgendsowas in der Art deute ich da *gg*
Was ist an Zeile 2 falsch? Kennt VBS kein Dim?
oder wird VBS schon durch
Private Sub Form_Load()
irritiert und bringt eine falsche Fehlermeldung?
Gruß
Reinhard
Hallo Reihard,
Was ist an Zeile 2 falsch? Kennt VBS kein Dim?
keine Datentypen.
Dim Variable geht, Dim Variable As Integer geht schon nicht.
Das weg nehmen nützt aber nichts, weil VBS auch kein Open kennt. 
Um die Datei lesen und schreiben zu können, muss ich FSO verwenden und das kann ich nicht aus dem Kopf. Also alles aus Script56.chm zusammenkopieren … Heute schaffe ich das nicht mehr, aber ich habe morgen schon wieder frei! *gg*
Gruß Rainer
Wäre super - stehe leider total auf dem Schlauch 
Heute schaffe ich das nicht
mehr, aber ich habe morgen schon wieder frei! *gg*
Gruß Rainer
- komplettes Dokument durchsuchen
- alle Zeilen in denen eine bestimmte ID auftaucht löschen
sowie die 3 Zeilen darüber und zwei darunter
Hi Nex,
schreib das in eine .vbs-Datei. Evtl. könnte es am Dateiende zu problemen kommen, dann schreibe halt oberhalb jeder Readline-Anweisung am Codeende ein:
If Quelle.AtEndOfStream = True Then Exit Do
Dim Quelle, Ziel, ff1, ff2, Zl, Mem1, Mem2, i, EF
Dim Src, Dest, FileSysObj, Pfad, Mem3, Mem4
Pfad = "H:\" '
Gruß
Reinhard
Hallo,
dann versuch mal diesen Code, praktisch das selbe in VBS.
Die alte Datei löschen und die veränderte Kopie umbenennen habe ich mit VBS noch nicht geschafft, das müsstest Du dann manuell erledigen. 
Gruß Rainer
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim fso, fDest, fSrc, Zl, Dest, Src, Mem1, Mem2, ID
Pfad = "C:\" '"" Then
fDest.WriteLine Mem2
End If
Mem2 = Mem1
Mem1 = ZL
Else
Zl = fSrc.ReadLine
Zl = fSrc.ReadLine
Mem2 = ""
Mem1 = ""
End If
Loop
fSrc.Close
fDest.Close
MsgBox "Bearbeitung beendet"
Hallo Reinhard,
jetzt haben wir gleichzeitig praktisch identische Codes geschrieben. Und das Ergebnis gleichzeitig hier gepostet.
Nette Übung!
Gruß Rainer
jetzt haben wir gleichzeitig praktisch identische Codes
geschrieben. Und das Ergebnis gleichzeitig hier gepostet. 
Nette Übung!
Hallo Rainer,
mutmaßlich hatten wir an den gleichen Codestellen die gleichen Probleme 
Man ist doch schon verwöhnt wenn man eine VB-Entwicklungsumgebung hat, die mehr bietet als nur ein Texteditor.
Autom. Großschreibung der Anfangsbuchstaben erkannter Schlüsselwörter, Intellisence usw.
Und auch Option Explicit, da wäre dein „Pfad“ bemängelt worden *gg*
natürlich auch Einzelschrittmodus, Haltepunkte nicht vergessen.
Gruß
Reinhard