Log auslesen

  • Hi,

    Ich hab hier eine Log die ich auslesen will.
    Bisher ist es mir auch schon gelungen teile auszulesen.
    Das ganze soll möglich schnell gehen weil die Logs ziemlich groß werden können.

    Hier mal ein ausschnitt aus der Log.

    Spoiler anzeigen


    Dazwischen sind dann auch noch andere ausgaben die mit [Datum Uhrzeit] beginnen.
    Was ich hier auslesen will ist das Datum und die Uhrzeit dazu noch die GUID (kann auch "" sein) und den namen (kann auch "" sein, kann auch Leerzeichen enthalten) .
    Was ich bisher auslesen konnte war die komplette liste einfach mit

    [autoit]

    $PBlist=_StringBetween($PBLogText,"^5Player List: [Slot #] [GUID] [Status] [Auth Rate] [Recent SS] [Name]", "^5End of Player List")

    [/autoit]


    Nur fehlt mir da dann die Uhrzeit und das Datum.
    Danach hab ich ein bisschen mit "StringRegExp" rumprobiert und konnte damit das Datum auslesen.

    [autoit]

    $data = StringRegExp($data, '(?:\[:?)([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,4} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})(?:\])', 3)

    [/autoit]

    Nur bring mir das gar nichts weil es ja keinen Bezug auf die Player List hat (da es auch andere befehle mit Datum/Uhrzeit gibt)

    Jetzt meine Frage wie kann ich am schnellsten die Log auslesen und dabei die Informationen wie oben genannt bekommen.


    MfG
    Griss

  • hi,

    Ich habe jetzt einen weg gefunden das Datum und die Zeit mit der Player List zu verbinden.

    [autoit]

    $data = StringRegExp($data, '(?:\[)([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,4} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})(?:\])(?: \^5Player List\: \[Slot \#\] \[GUID\] \[Status\] \[Auth Rate\] \[Recent SS\] \[Name\])(?s)(.*?)(?:\^5End of Player List)', 3)

    [/autoit]


    Jetzt muss ich nur noch die GUID's und die Namen bekommen.
    Ich bin offen für schneller Möglichkeiten so viel ich weiß ist "StringRegExp" nicht so schnell...

    MfG
    Griss

  • Hier:

    [autoit]

    #include <Array.au3>

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

    $sLog = FileRead("deinLog.txt")

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

    $aRegEx1 = StringRegExp($sLog,"(?s)(?<=\[).+?(?=End)",3)

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

    _ArrayDisplay($aRegEx1)

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

    $aRegEx2 = StringRegExp($sLog,"(?s)\^\d+\s(.*?)\s.*?\s.*?\s.*?\s(.*?)\s",3)

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

    _ArrayDisplay($aRegEx2)

    [/autoit]

    Noch nen hübsches Schleifchen drum machen und fertig.

    Datum hab ich weg gelassen, das ist ja trivial.

    Edit:

    Sehe gerade das du RegEx noch nicht so kannst, also hier nochmal gleich mit Datum:

    [autoit]

    (?s)(?<=\[)(.+?)\s(.+?)\s(.+?)(?=End)

    [/autoit]

    ( Datum und Uhrzeit hab ich mal getrennt, je nach dem wie du es willst )

    2 Mal editiert, zuletzt von Greek (7. September 2013 um 22:40)

  • Hi,

    Ich habe es jetzt selbst hinbekommen.
    Dein Script funktioniert leider nicht ganz.
    Es gibt mir leider auch noch andere Zeilen in der log mit aus.
    Evtl. auch mein Fehler hier nochmal die log mit bsp. für die ausnahmen die vorkommen können (sind nicht alle):

    Spoiler anzeigen

    Ich kann dir auch nicht genau sagen wiso weil ich erst seit heute mit RegExp Arbeite aber das hier ist jetzt meine Lösung:

    [autoit]

    $data = StringRegExp($data, '(?:\[)([0-9]{1,2}.[0-9]{1,2}.[0-9]{1,4} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2})(?:\])(?: \^5Player List\: \[Slot \#\] \[GUID\] \[Status\] \[Auth Rate\] \[Recent SS\] \[Name\])(?s)(.*?)(?:\^5End of Player List)', 3)
    $data2=StringRegExp($data[1], '(?:\^5[0-9]{1,2}\s{1,2})([a-f0-9]{0,8})(?:\(VALID\) OK [0-9].[0-9] [0-9]\{[0-9]\|[0-9]\} )(.*?(?m)$)',3);

    [/autoit]


    Das muss natürlich noch durch eine schleife laufen...

    Wenn jemand evtl. noch eine schneller Möglichkeit kennt...
    Hier nochmal die Erklärung der Kriterien für den "match".

    Spoiler anzeigen
    • Datum in mm.dd.yyyy
    • Zeit in hh:mm:ss
    • dieser Text "^5Player List: [Slot #] [GUID] [Status] [Auth Rate] [Recent SS] [Name]" (immer der selbe)
    • immer am anfang "^5" und dann eine zahl von 0-9 ein bis zwei mal
    • 1 oder 2 leerzeichen je nach dem ob die zahl 2 stellig oder einstellig wahr
    • die GUID immer 8 stellen [a-f] und [0-9]
    • dieser Text "(VALID) OK "
    • dann [0-9].[0-9] [0-9]{[0-9]|[0-9]}
    • leerraum
    • name zeilenumbruch
    • und ganz am ende "^5End of Player List"