Textdatei mit VBS verändern

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

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 :confused:

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

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. :smile: 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. :smile: 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 :wink:)*

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 :wink:)*

das wäre auch schwierig, das ist mir auf meinem Unix Server passiert. (SCO Open Server 5.0) :smile: 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. :smile:

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

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 :confused:

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

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. :smile: Nette Übung!

Gruß Rainer

jetzt haben wir gleichzeitig praktisch identische Codes
geschrieben. Und das Ergebnis gleichzeitig hier gepostet. :smile:
Nette Übung!

Hallo Rainer,

mutmaßlich hatten wir an den gleichen Codestellen die gleichen Probleme :smile:

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