Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Datei mit RegEx parsen - wie generell vorgehen? Performance (https://www.delphipraxis.net/133813-datei-mit-regex-parsen-wie-generell-vorgehen-performance.html)

Pilloker 9. Mai 2009 13:44


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.

worker 11. Mai 2009 06:27

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.

alzaimar 11. Mai 2009 07:12

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.

Reinhard Kern 11. Mai 2009 08:10

Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
 
Zitat:

Zitat von worker
Hat denn niemand eine Meinung dazu? Mich würde es auch interessieren, wie Ihr da so vorgeht.

Hallo,

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

Pilloker 11. Mai 2009 19:33

Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
 
Danke.

Werde mal sehen, was ich davon gebrauchen kann :)

Hat jemand weitere Vorschläge?

worker 12. Mai 2009 06:48

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:

[...]
bcm4sbxp
Service Control Manager
Ereignis_1
DCOM
Ereignis_7
Ereignis_14
Ereignis
VMnetuserif
bcm4sbxp
DCOM
DCOM
eventlog
srservice
Ereignis_17
LsaSrv
Service Control Manager
[...]
Da würde das Beispiel mit dem sich automatisch generierenden ObjectTree ja nicht funktionieren.
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.

Pilloker 13. Mai 2009 14:22

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?

Reinhard Kern 13. Mai 2009 16:25

Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
 
Zitat:

Zitat von worker
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?
...
Da würde das Beispiel mit dem sich automatisch generierenden ObjectTree ja nicht funktionieren.
....

Hi,

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

worker 14. Mai 2009 08:08

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 von Pilloker
[...]
Ich gehe die Datei in einer Schleife Zeile für Zeile durch
[...]

2. Bei jeder Zeile schauen, welches der bekannten Unterobjekte sie enthält. Das entspricht
Zitat:

Zitat von Pilloker
[...]
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.
[...]

Oder sehe ich das falsch?

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

Reinhard Kern 14. Mai 2009 11:26

Re: Datei mit RegEx parsen - wie generell vorgehen? Performa
 
Zitat:

Zitat von worker
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.

Hallo,

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 17:00 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz