![]() |
Datei mit RegEx parsen - wie generell vorgehen? Performance
Hallo,
ich habe eine allgemeine Frage zum Parsen einer Textdatei mittels regulärer Ausdrücke. Beispiel: Die Einträge einer Logdatei (wie auch immer die aussehen mag - ist erstmal irrelevant) sollen in ein neues Format gebracht werden. Wie geht man hier am besten vor? Die einzige Möglichkeit, die mir einfällt, wäre folgende: Ich gehe die Datei in einer Schleife Zeile für Zeile durch und vergleiche dann die aktuelle Zeile widerrum in einer Schleife mit allen möglichen von mir definierten Regulären Ausdrücken. Habe ich einen Treffer schreibe ich die Zeile weg und nehme mir die nächste Zeile vor. Ich habe also zwei Zwei Schleifen und gehe jedesmal unter Umständen alle vordefinierten Regulären Ausdrücke durch; jedenfalls so lange, bis ich einen Treffer habe. Ist dieses Vorgehen in Ordnung? Kann man etwas anders/besser machen? Oder geht soetwas ganz anders? Wie sieht es mit Performance aus? Gibt es etwas schnelleres? Wichtig ist mir das Ganze unter Verwendung Regulärer Ausdrücke. Danke. |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Hat denn niemand eine Meinung dazu? Mich würde es auch interessieren, wie Ihr da so vorgeht.
|
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Schneller geht es in jedem Fall: Google mal nach 'multi pattern matching'.
Wenn Du allerdings nach mehreren regulären Ausdrücken (also keine festen Texte) suchen musst, könnte ich mir vorstellen, das eine NDEA (Nichtdeterministischer endlicher Automat) hier gute Dienste leisten würde. Ob es schneller geht, weiss ich nicht. |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Zitat:
ich programmiere mir dazu eine Klassenhierarchie, z.B. für die schon ziemlich komplexe Definition einer Leiterplatte. Dazu gibt es ein Root-Objekt, und die Datei fängt ja auch mit einem Objekt "PCB" an. Wenn ich dem Rootobjekt einen Datenamen übergebe, wird die Datei gelesen - das Objekt PCB weiss welche Unterobjekte (Assignments, Library, Components...) enthalten sein können: kommt da Library, so wird ein Unterobjekt angehängt, das die Subklasse Library hat und seinerseits die Datei weiterliest und z.B. Footprint findet, dann wird ein Objekt Footprint angehängt usw. usw. Jede Subklasse weiss, was an Daten enthalten sein kann, z.B. kann ein Footprint beliebig viele Pads enthalten und diese jeweils X und Y Koordinaten, Drehwinkel, Bohrdurchmesser usw. Ein Drehwinkel ist dabei ein generisches Objekt (weil er in der Textdatei auch immer gleich formatiert ist) und hat in dem Fall als Parent eben das Pad. Unbekannte Definitionen werden bis zum Ende gelesen und ignoriert, das erleichtert die Entwicklung und macht die Software sehr robust. Langer Rede kurzer Sinn: Mit Root-Objekt und Assign einer Datei entsteht von selbst ein Object Tree, der die Leiterplatte komplett repräsentiert, auch wenn sie 100000 Details enthält. Dabei stecken Syntax und Semantik der Datei in der Klassenhierarchie, während sich die Struktur der Leiterplatte im Object Tree abbildet, den man anschliessend weiterverarbeitet. Hat sich auch als pflegefreundlich erwiesen, wenn z.B. bei den Bauteilen ein "Wert" zusätzlich definiert wird, so füge ich in der Subklasse Component dem Suchen nach Details den Case "Value" zu und dazu wird eine neue Subklasse Value definiert, die ihrerseits einen Text in Anführungszeichen einliest (Standardmethode) oder was auch immer. Mehr anzuführen hat hier keinen Sinn, ist ja auch kein Delphi-Thema. Gruss Reinhard |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Danke.
Werde mal sehen, was ich davon gebrauchen kann :) Hat jemand weitere Vorschläge? |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Das mit der Klassenhierarchie hört sich interessant an. Auch wenn die Ursprungsdaten da ja schon irgendwie hierarchisch vorliegen müssen.
Was ist aber bei einer Logdatei, die willkürlich nacheinander bestimmte Ereignisse (die bekannt sind) auflistet? Nehmen wir mal als Beispiel das Eventlog. Zitat:
Hier sehe ich nur die Möglichkeit, die von Pilloker genannten Schleifen einzusetzen. Zu Multi Pattern Matching habe ich bisher noch nicht viel erquickendes finden können. |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Ich habe zu 'Multi Pattern Matching' leider auch nichts finden können, was mich irgendwie weiter bringt; außer irgendwelcher mathematischen Abhandlungen :(
@alzaimar Hast Du eine Quelle, die mir weiterhelfen könnte? |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Zitat:
soweit ich das auf Anhieb übersehen kann, würde es schon funktionieren, nur gibt es keinen Tree, weil es halt keiner ist - das Ergebnis wäre eine lineare Liste von Objekten, die jeweils dem Ereignis entsprechen. Was auch immer man damit anfängt. Ich schätze mal, eine andere Methode liefert auch nichts anderes, weil das Ganze eben keine hierarchische Struktur hat. Übersetzen könnte man gut damit (dafür habe ich es ja entwickelt), wenn jede Subklasse (=Log Event) weiss, wie sie im Zielformat auszugeben ist. Gruss Reinhard |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Hallo Reinhard,
aber dennoch musst Du bei Deinem Vorgehen, egal ob als Ergebnis eine lineare Objektliste oder ein Tree dabei herauskommen, so vorgehen, wie von Pilloker beschrieben. Sprich, Du musst 1. Die Datei von vorne bis hinten durchrattern. Das enspricht Zitat:
Zitat:
Als Alternative käme aus meiner Sicht nur das von alzaimar genannte 'Multi Pattern Matching' in Frage (hört sich von der Begrifflichkeit zumindest so an, als ob das eine Lösung sein könnte). Leider hat sich alzaimar noch nicht zu einer Quelle geäußert :( |
Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
Zitat:
Vergleiche einzusparen war nicht meine Absicht, sofern das überhaupt theoretisch geht. Ich wollte eine gut strukturierte Software schreiben. Soweit ich weiss kann MPM Stichwörter in Texten effektiv finden, aber die Methode prüft keine Syntax - ich könnte also feststellen, dass das Token "Pad" 5000 mal vorkommt, aber ich wüsste nicht, welches Pad zu welchem Bauteil gehört oder welche x-Koordinate zu welchem Pad. Es ist sicher verständlich, dass das eine lebenswichtige Information ist. Gruss Reinhard |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz