Log-Datei auswerten (find - write)

  • Hallo Community,

    ich habe eine bat Datei erstellt die durch:

    findstr /i "SUCHWORT" %1 >>ERGEBNIS.txt

    eine Log Datei eines OnlineGames nach bestimmten Wörtern durchsucht und dann die komplette Zeile in der das gefundene Wort steht in eine neue Datei schreibt.
    Die zu suchenden Wörter werden nacheinander aus einer txt Datei ausgelesen und dann die Logdatei durchsucht (in jeder Zeile der txt-Datei steht ein Suchwort momentan 30).
    Das zu suchende Wort kann auch öfter in der Log Datei vorkommen.

    Soweit hatte ich das in der bat-Datei hinbekommen.
    Nun möchte ich dieses Script aber auch anderen zur Verfügung stellen, möchte aber nicht den Quellcode mitliefern.
    Darum würde ich dies gern mit AutoIt machen.

    Da ich aber noch nicht so viel Erfahrung mit AutoIt habe würde ich mich um etwas Hilfe von euch freuen...

    Vielen Dank im Voraus

    Einmal editiert, zuletzt von MasterX87 (18. Juni 2008 um 19:02)

  • Hi,
    im Prinzip ist das garnet so schwer. Als Anfangsscript für Autoit hast du dir natürlich gleich alles ausgesucht. Datei auslesen, String bearbeiten und Datei wegschreiben.
    Hast du dir schonmal die Autoithilfe angeschaut die bei Autoit dabei ist? (CHM Datei im Autoitverzeichniss)
    Weil wenn du noch keinen Quelltext hier postest dann kann man dir leider auch net helfen. Wenn andere das Programm schreiben lernst du auch kein Autoit.

    Also einfach mal anfangen und bei Fragen den Quelltext posten wo du net weiter kommst und dann wird dir bestimmt geholfen.

    Tip:
    schau mal unter "fileread, stringmid, filewrite nach ;)

    MfG
    Der_Doc

  • So, den ersten Teil hab ich mir mal zusammen gesucht und getestet.
    Hoffe ich habs nicht all zu kompliziert gemacht ;)?

    Meine zu suchenden Wörter habe ich nun aus der Datei liste.txt ausgelesen und gesplittet.
    Wie gleiche ich nun die Logdatei.log so mit den Wörtern ab, dass am Ende die Ergebnis.txt rauskommt?

    Ich stehe da grade voll auf dem Schlauch...
    Bitte helft mir :)

    liste.txt

    Spoiler anzeigen
    Code
    badword,böse,schlecht,dumm


    Script.au3

    Spoiler anzeigen
    [autoit]

    #include<Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $datei = FileOpen("liste.txt", 0)

    [/autoit] [autoit][/autoit] [autoit]

    ; Überprüfe ob die Datei geöffnet werden konnte
    If $datei = -1 Then
    MsgBox(0, "Error", "Konnte Datei nicht öffnen.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Lese die Badwords Liste in String $badword
    While 1
    Global $badwords = FileRead($datei)
    If @error = -1 Then ExitLoop
    MsgBox(0, "Inhalt der Liste:", $badwords)
    $badword = $badwords
    Wend

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($datei)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Splitte den String $badword in die einzelnen Wörter
    $word = StringSplit ( $badword, "," )

    [/autoit] [autoit][/autoit] [autoit]

    ; Test der Ausgabe
    MsgBox(0,"Anzahl Badwords", $word[0])
    MsgBox(0,"Badword1", $word[1])
    MsgBox(0,"Badword2", $word[2])
    MsgBox(0,"Badword3", $word[3])
    MsgBox(0,"Badword4", $word[4])

    [/autoit]


    Logdatei.log

    Spoiler anzeigen
    Code
    Player1 wrote: Guter Schuss
    Player2 wrote: Schöhn gemacht
    Player3 wrote: Du bist dumm
    Player4 wrote: Das ist böse
    Player5 wrote: Sei doch nicht so
    Player6 wrote: Du bist selber dumm
    Player7 wrote: Hier ist keiner dumm!


    Ergebnis.txt

    Spoiler anzeigen
    Code
    Player3 wrote: Du bist dumm
    Player4 wrote: Das ist böse
    Player6 wrote: Du bist selber dumm
    Player7 wrote: Hier ist keiner dumm!
  • Hi,
    na das sieht doch eigentlich net so schlecht aus. Ich habe es mal umgebaut und angepasst.
    Weis aber net wie träge es wird wenn die Badwords und das Logfile ziemlich groß werden.

    Bin auch kein Experte in "StringRegExp" aber es funktioniert zummindest. ;)


    Spoiler anzeigen
    [autoit]

    ;~ Es muss folgendes existieren
    ;~ eine Datei mit liste.txt und eine Logdatei.log

    [/autoit] [autoit][/autoit] [autoit]

    #include <file.au3>
    #include <Array.au3>
    Dim $badwords
    Dim $filepath = "liste.txt"
    Dim $logfilepath = "Logdatei.log"
    Dim $ergfilepath = "ergebniss.txt"
    Dim $erg

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ Datei mit den badwords einlesen | Badwors in der Datei mit Enter trennen (@CR)
    If Not _FileReadToArray($filepath,$badwords) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ Logfile öffnen und vergleichen
    $filelog = FileOpen($logfilepath, 0)
    ; Check if file opened for reading OK
    If $filelog = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ; Read in lines of text until the EOF is reached
    While 1
    $line = FileReadLine($filelog)
    If @error = -1 Then ExitLoop
    For $x = 1 to $badwords[0]
    if (StringRegExp($line, $badwords[$x]) > 0 ) Then
    $erg = $erg & $line & @crlf
    EndIf
    Next
    Wend
    FileClose($filelog)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Ergebniss in eine Datei schreiben
    $fileerg = FileOpen($ergfilepath, 2) ; 1 = anhängen | 2 = überschreiben

    [/autoit] [autoit][/autoit] [autoit]

    ; Check if file opened for writing OK
    If $fileerg = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    FileWrite($fileerg, $erg )
    FileClose($fileerg)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"Meldung","Das Skript ist am Ende")
    ; Test der Ausgabe
    ;~ For $x = 1 to $badwords[0]
    ;~ Msgbox(0,'Badword:' & $x, $badwords[$x])
    ;~ Next

    [/autoit]

    In der Datei "liste.txt" würde ich die Einträge durch Enter trennen (liest sich besser).
    Im Moment wird die Datei Ergebniss bei jedem Durchlauf überschrieben.

    Kannst es ja mal testen ob es so das ist was du brauchst.

    Das ist bestimmt net die beste Lösung, aber es ist eine funktionierende. :D

    MfG
    Der_Doc

  • Vielen Dank für die Hilfe.
    Sieht gut aus :)

    Bei ner Log mit 5MB (58000 Zeilen) und 20 "badwords" = 165 Ergebnisse dauert der Abgleich ca. 15sec.
    Zeitverhalten ist für mich OK.

    Hab das jetzt mal test weise mit meinem alten bat Script verglichen, da ist mir durch die unterschiedliche Anzahl der Ergebnisse aufgefallen,
    dass dein Vorschlag groß und Kleinschreibung unterscheidet.

    Wenn ich mir die Hilfe anschau würde ich dies so lösen, stoße aber immer auf einen Fehler:

    [autoit]

    if (StringRegExp((?i)$line, (?i)$badwords[$x]) > 0 ) Then

    [/autoit]

    Wie müsste es denn richtig heißen?
    Habe es schon an verschiedene Stellen gesetzt die ich mir vorstellen könnte, aber keine funktioniert :(

  • Strings müssen natürlich in Anführungsueichen und mit & verkettet werden :) Und im Parameter 1 wird der Schalter nicht benötogt :)

    [autoit]

    ($line, "(?i)"&$badwords[$x]) > 0 )

    [/autoit]
  • Vielen Dank euch beiden für die Hilfe :)

    Funktioniert jetzt super :)

    Jetzt nur noch ne kleine Gui Oberfläche machen um zwischen verschiedenen Funktionen zu wählen .. aber das schaff ich alleine ;)

    Bis bald...

  • Moin,
    ja kein Prob war net so schwer und ich habe auch schon andere Aufgaben für das Skript gefunden.

    Wenn du nen Gui fertig hast, dann poste es mal würde mich interessieren.

    PS:
    Ich hasse Reguläre Ausdrücke, das liegt bestimmt daran das ich da net genau durchsteige. :huh:

    MfG
    Der_Doc

  • Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GUIConstants.au3>
    #include <ProgressConstants.au3>
    #include <File.au3>
    #include <Misc.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Chat-Log Auswahl", 350, 120, 193, 125)
    $Button1 = GUICtrlCreateButton("Montag", 10, 20, 100, 25, 0)
    $Button2 = GUICtrlCreateButton("Dienstag", 125, 20, 100, 25, 0) ;das is der 2.te button
    $Button3 = GUICtrlCreateButton("Mittwoch", 240, 20, 100, 25, 0) ;das is der 3.te button
    $Button4 = GUICtrlCreateButton("Donnerstag", 10, 50, 100, 25, 0) ;das is der 3.te button
    $Button5 = GUICtrlCreateButton("Freitag", 125, 50, 100, 25, 0) ;das is der 3.te button
    $Button6 = GUICtrlCreateButton("Samstag", 240, 50, 100, 25, 0) ;das is der 3.te button
    $Button7 = GUICtrlCreateButton("Sonntag", 125, 80, 100, 25, 0) ;das is der 3.te button

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

    Case $Button1 ;hier bestimmst du welcher button in diesem fall eben button1
    _Func1 () ;Hier bestimmst du wie die Funktion heisst die bei einem klick auf dem Button1 aus geführt wird
    ExitLoop
    Case $Button2 ;hier bestimmst du welcher button in diesem fall eben button2
    _Func2 () ;Hier bestimmst du wie die Funktion heisst die bei einem klick auf dem Button2 aus geführt wird
    ExitLoop
    Case $Button3 ;hier bestimmst du welcher button in diesem fall eben button3
    _Func3 () ;Hier bestimmst du wie die Funktion heisst die bei einem klick auf dem Button2 aus geführt wird
    ExitLoop
    Case $Button4 ;hier bestimmst du welcher button in diesem fall eben button4
    _Func4 () ;Hier bestimmst du wie die Funktion heisst die bei einem klick auf dem Button2 aus geführt wird
    ExitLoop
    Case $Button5 ;hier bestimmst du welcher button in diesem fall eben button5
    _Func5 () ;Hier bestimmst du wie die Funktion heisst die bei einem klick auf dem Button2 aus geführt wird
    ExitLoop
    Case $Button6 ;hier bestimmst du welcher button in diesem fall eben button6
    _Func6 () ;Hier bestimmst du wie die Funktion heisst die bei einem klick auf dem Button2 aus geführt wird
    ExitLoop
    Case $Button7 ;hier bestimmst du welcher button in diesem fall eben button7
    _Func7 () ;Hier bestimmst du wie die Funktion heisst die bei einem klick auf dem Button2 aus geführt wird
    ExitLoop
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Func1 () ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button1 zugewiesen wurde
    Global $ClogDir = (@ScriptDir & "\" & "Montag-Mon")
    Global $Tag = ("Monntag")
    Global $log = ("ChatLog-Mon.log")
    MsgBox(64, "Chat-Log Auswertung", "Wenn die Auswertung fertig ist, findest du das Ergebnis unter:" & @CRLF & @CRLF & "\Montag-Mon\Auswerung\")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Func2 () ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button2 zugewiesen wurde
    Global $ClogDir = (@ScriptDir & "\" & "Dienstag-Tues")
    Global $Tag = ("Dienstag")
    Global $log = ("ChatLog-Tues.log")
    MsgBox(64, "Chat-Log Auswertung", "Wenn die Auswertung fertig ist, findest du das Ergebnis unter:" & @CRLF & @CRLF & "\Dienstag-Tues\Auswerung\")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Func3 () ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button3 zugewiesen wurde
    Global $ClogDir = (@ScriptDir & "\" & "Mittwoch-Wed")
    Global $Tag = ("Mittwoch")
    Global $log = ("ChatLog-Wed.log")
    MsgBox(64, "Chat-Log Auswertung", "Wenn die Auswertung fertig ist, findest du das Ergebnis unter:" & @CRLF & @CRLF & "\Mittwoch-Wed\Auswerung\")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Func4 () ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button4 zugewiesen wurde
    Global $ClogDir = (@ScriptDir & "\" & "Donnerstag-Thur")
    Global $Tag = ("Donnerstag")
    Global $log = ("ChatLog-Thur.log")
    MsgBox(64, "Chat-Log Auswertung", "Wenn die Auswertung fertig ist, findest du das Ergebnis unter:" & @CRLF & @CRLF & "\Donnerstag-Thur\Auswerung\")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Func5 () ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button5 zugewiesen wurde
    Global $ClogDir = (@ScriptDir & "\" & "Freitag-Fri")
    Global $Tag = ("Freitag")
    Global $log = ("ChatLog-Fri.log")
    MsgBox(64, "Chat-Log Auswertung", "Wenn die Auswertung fertig ist, findest du das Ergebnis unter:" & @CRLF & @CRLF & "\Freitag-Fri\Auswerung\")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Func6 () ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button6 zugewiesen wurde
    Global $ClogDir = (@ScriptDir & "\" & "Samstag-Sat")
    Global $Tag = ("Samstag")
    Global $log = ("ChatLog-Sat.log")
    MsgBox(64, "Chat-Log Auswertung", "Wenn die Auswertung fertig ist, findest du das Ergebnis unter:" & @CRLF & @CRLF & "\Samstag-Sat\Auswerung\")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Func7 () ;Hier wird eine Funktion gestartet und zwar die funktion die oben dem Button7 zugewiesen wurde
    Global $ClogDir = (@ScriptDir & "\" & "Sonntag-Sun")
    Global $Tag = ("Sonntag")
    Global $log = ("ChatLog-Sun.log")
    MsgBox(64, "Chat-Log Auswertung", "Wenn die Auswertung fertig ist, findest du das Ergebnis unter:" & @CRLF & @CRLF & "\Sonntag-Sun\Auswerung\")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("Auswertung in Arbeit...",300,350,-1,-1, BitOR($WS_SIZEBOX, $WS_SYSMENU))
    GuiCtrlCreateLabel("Bereite Auswertung vor", 65, 230)
    $progress = GuiCtrlCreateProgress(65, 250, 150, 20)
    GUICtrlCreatePic("config\loading.gif",65,50, 169,150)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $gui)
    For $i = 0 to 100 Step 10
    Sleep(500)
    GuiCtrlSetData($progress, $i)
    next
    ;~ guictrlsetdata($progress,100)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $gui2 = GUICreate("Auswertung in Arbeit...",300,350,-1,-1, BitOR($WS_SIZEBOX, $WS_SYSMENU))
    GuiCtrlCreateLabel("Auswertung wird durchgeführt..." & @CRLF & @CRLF & "Dies kann einige Sekunden dauern", 65, 230)
    GUICtrlCreatePic("config\loading2.gif",65,50, 169,150)
    GUISetState(@SW_SHOW, $gui2)

    [/autoit] [autoit][/autoit] [autoit]

    Dim $badwords
    Dim $filepath = (@ScriptDir & "\config\badname.txt")

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Dim $logfilepath = "Logdatei.log"
    Dim $logfilepath = ($ClogDir & "\" & $log)
    ;~ Dim $ergfilepath = "ergebniss.txt"
    Dim $ergfilepath = ($ClogDir & "\Auswertung\" & $Tag & "_" & @MDAY & "-" & @MON & "-" & @YEAR & ".txt")
    Dim $erg

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ Datei mit den badwords einlesen | Badwors in der Datei mit Enter trennen (@CR)
    If Not _FileReadToArray($filepath,$badwords) Then
    MsgBox(4096,"Error", " Error reading log to Array error:" & @error)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ Logfile öffnen und vergleichen
    $filelog = FileOpen($logfilepath, 0)
    ; Check if file opened for reading OK
    If $filelog = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    ; Read in lines of text until the EOF is reached
    While 1
    $line = FileReadLine($filelog)
    If @error = -1 Then ExitLoop
    For $x = 1 to $badwords[0]
    if (StringRegExp($line, "(?i)"&$badwords[$x]) > 0 ) Then
    $erg = $erg & $line & @crlf
    EndIf
    Next
    Wend
    FileClose($filelog)

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Ergebniss in eine Datei schreiben
    $fileerg = FileOpen($ergfilepath, 2) ; 1 = anhängen | 2 = überschreiben

    [/autoit] [autoit][/autoit] [autoit]

    ; Check if file opened for writing OK
    If $fileerg = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf
    FileWrite($fileerg, $erg )
    FileClose($fileerg)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"Fertig ...","Fertig! - Die Chat-Log von " & $Tag & " wurde erfolgreich ausgewertet.")
    ; Test der Ausgabe
    ;~ For $x = 1 to $badwords[0]
    ;~ Msgbox(0,'Badword:' & $x, $badwords[$x])
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Run("Explorer.exe " & $ClogDir & "\Auswertung")

    [/autoit]

    So sieht es momentan aus. Das mit der Loading Anzeige während der Abgleich läuft gefällt mir zwar nicht so ganz, aber besser hab ich das nicht hinbekommen ;)

    Vielleicht hat ja wer eine bessere Idee?