Parsen eines Logfiles, Herangehensweise

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Parsen eines Logfiles, Herangehensweise

    Hallo,

    ich habe einen neuen Auftrag und muss ein doch recht komplexes Logfile parsen sodass ich die dort eingetragenen Werte am besten in einer strukturierten klasse wiederfinde.
    Da das Log sehr lang ist habe ich es auf pastebin hochgeladen.

    Wie man unschwer erkennen kann, werden dort Werte abgeschnitten und in die nächsten Zeilen weitergeführt. Ich habe absolut keinen Plan wie ich an sowas herangehen soll. Muss man dafür einen Lexer schreiben oder kann man das auch mit RegEx oder gar simplen splitten lösen.

    Wie würdet ihr an so etwas herangehen?

    Übrigens, im Log weiter unten, wechselt auch hin und wieder mal die Ausgabe, also ab dort kommen dann andere Werte, müssen aber auch geparsed werden.

    PS: Am Besten scrollt ihr im Paste ganz nach unten und kopiert euch das Paste aus dem Raw Paste dings raus, ich weiß nicht ob Pastebin im oberen noch selbst irgendwas anstellt bezüglich formatieren.

    Danke im Voraus
    @seh Ich hab Zeile 1651ff hier:
    Record Drehmomen Spitzenwi Winkelerg Spitzenst Zykluszeit Strategie
    # tergebnis nkel ebnis romstärke
    Sieht so aus, als wüsste der Schreiber, wenn eine Überschrift zerlegt wurde.
    Lies also einfach rer Reihe nach Zeilen ein (.IO.File.ReadLines(PFAD)) und pass auf, wenn eine neue Log-Zeile beginnt.
    Wenn, dann verarbeite die 3 oder 4 zusammengehörenden Zeilen.
    Lerning by Doing:
    Nimm Dir den ersten Zeilentyp und programmiere das Parsen.
    Wirf eine Exception, wenn ein neuer Zeilentyp kommt.
    Momentan sehe ich 3: Titel, Überschrift, Daten.
    Das ist dann eine reine Fleißaufgabe.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany Ja ich hatte auch schon so ähnlich überlegt:
    Ich habe jetzt zum groben Testen schonmal einen StreamReader angelegt,
    der mir in einer while(!reader.EndOfStream) alle Zeilen mit reader.ReadLine() ausliest.
    Soweit so gut, aber die Überschriften zum Beispiel sind unterschiedlich lang. Z.B. die von dir genannte Zeile.
    Wenn ich jetzt schonmal wüsste das jede Übeschriften Spalte so und so lang sein kann, dann wäre das ja schonmal einfacher, aber die die Spaltenbreite scheint doch eine beliebige Breite zu haben oder nicht?

    seh schrieb:

    Wenn ich jetzt schonmal wüsste das jede Übeschriften Spalte so und so lang sein kann
    Erkenne den Start einer neuen Daten-Zeile, da ist die alte vollständig eingelesen.
    Zum Vorgehen:
    Initial beginnt eine neue Zeile.
    Jede Zeile, die nicht leer ist, wird lokal in eine List(Of String) gepackt.
    Ist die gerade gelesene Zeile eine neue Datenzeile (das musst Du sofort testen), wird die List(Of Strings) an eine Prozedur übergeben, die die Zeile restauriert.
    Die List(Of String) wird gelöscht und die neue eerste Zeile hineingepackt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!