Laden...

RegEx - Fortschrittsleiste?

Erstellt von Maaka vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.492 Views
Maaka Themenstarter:in
21 Beiträge seit 2010
vor 13 Jahren
RegEx - Fortschrittsleiste?

Hi,

so ich probiere im Moment aus einer HTML Seite ein paar Daten herauszufiltern. Dachte ich mir: für sowas müsste doch RegEx ganz gut sein...

Also hab ich ein RegEx gebaut, das funktioniert auch ganz gut mit einem Teil der Seite, es hat 2 Gruppen, die es dann herausfiltert... mit mehreren Captures

Nun funktioniert das ganze aber im großen (38000~ Zeilen mit 1813000~ Zeichen) nicht so... denn dann hängt das Programm einfach, naja das kann man wohl beheben in dem man das RegEx in einen eigenen Thread packt... nun nervt es aber wenn man 6+ Minuten (hab 6 Minuten gewartet, bevor ich es geschlossen habe) warten muss ohne irgendein Fortschritt zu sehen.

Also gibt es eine Möglichkeit bei RegEx den Fortschritt zu "messen" oder muss ich RegEx sein lassen und das selbst Zeile-für-Zeile durchgehen? (also mit StreamReader / ReadLine / Contains / etc)

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo Maaka,

HTML Seite [..] 38000~ Zeilen mit 1813000~ Zeichen

8o - Das zeigt auch kein Browser mehr wirklich flüssig an!
Bist du dir sicher, dass es keine Möglichkeit gibt, an die Daten vielleicht in einem anderen Format zu gelangen?

oder muss ich RegEx sein lassen und das selbst Zeile-für-Zeile durchgehen? (also mit StreamReader / ReadLine / Contains / etc)

Ja - das wird die einzige Möglichkeit sein.
Regex ist ja eher für "kleinere" Inputs gedacht; eine Rückmeldung zum Fortschritt stellt es nicht bereit.

Eventuell kannst du aber dein Pattern weiter optimieren. Wunder wird das aber vermutlich auch nicht vollbringen.

Ansonsten kannst du mal nach einem SGML-Reader probieren - der sollte dir das HTML Dokument ähnlich wie XML aufbereiten.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Maaka,

nun nervt es aber wenn man 6+ Minuten warten muss ohne irgendein Fortschritt zu sehen.

während der Suche nach einem Match bekommt man bei Regex selbst keine Fortschrittsrückmeldung, sondern immer nur für jeden (weiteren) gefundenen Treffer.

hab 6 Minuten gewartet, bevor ich es geschlossen habe

Möglicherweise ist dein Pattern suboptimal. Ich weiß natürlich nicht, wie lang die Zeilen sind, aber ich schätze die zu durchsuchende Datenmenge zwischen 100kB und 100MB. Bei solchen Datenmengen sollte Regex eigentlich nur so flutschen (bei 100MB maximal wenige Sekunden).

naja das kann man wohl beheben in dem man das RegEx in einen eigenen Thread packt

Nicht nur kann, sondern sollte bzw. muss.

herbivore

R
234 Beiträge seit 2007
vor 13 Jahren

Hallo Maaka,

HTML sollte man niemals mit RegEx parsen. Reguläre Ausdrücke sind, wie der Name schon sagt, für reguläre Sprachen gedacht, zu denen HTML nicht zählt. Du wirst ziemlich schnell Probleme kriegen, wenn sich etwas im Aufbau der HTML-Datei verändert. (siehe auch hier 😉)

Ich kann dir das HtmlAgilityPack empfehlen. Die Verwendung ist analog zu den, im Framework vorhanden, XML-Klassen (XMLDocument, XMLNode etc.). Zusätzlich ist es auch noch ziemlich Fehlertolerant.

Edit: Ups, hab deinen Namen falsch geschrieben.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo rastalt,

HTML sollte man niemals mit RegEx parsen.

HTML (vollständig) zu parsen ist ja was anderes als "aus einer HTML Seite ein paar Daten herauszufiltern". Für letzteres kann man ohne weiteres Regex verwenden. Es reicht ja, wenn sich das zu findende Muster regulär beschreiben lässt und das in den meisten praktischen Fällen gegeben.

Ob ein HTML-Parser erforderlich ist oder sogar Vorteile bring hängt vom konkreten Fall ab. In vielen praktischen Fällen, wird man mir Regex einfacher und schneller ans Ziel kommen.

herbivore

F
60 Beiträge seit 2010
vor 13 Jahren

poste doch mal dein pattern, daran kanns nämlich gut liegen. auf der anderen seite:
lies doch zeilenweise ein und parse zeile für zeile, dann hast du bei den 38000 zeilen auch 38000 möglichkeiten deinen progress anzuzeigen.

edit: xmlreader könnten sich allerdings auch anbieten, einfacher xpath ausdruck und fertig. allerdings habe ich keine ahnung was von beiden performanter ist. aber in 6 minuten parse ich dir auch 100mb text mit meinem taschenrechner, der fehler liegt hier wohl in der implementierung.
weil du meintest, nach 6min hast du ohne ergebnis den process gekilled: schon mal probiert ob du auf nem subset der daten eine lösung bekommst? nich dass du hier in einer eleganten endlosschleife hängst ^^

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo fielding,

lies doch zeilenweise ein und parse zeile für zeile, dann hast du bei den 38000 zeilen auch 38000 möglichkeiten deinen progress anzuzeigen.

was allerdings nur funktioniert, wenn garantiert ist, dass die Treffer immer vollständig auf jeweils einer Zeile liegen.

xmlreader könnten sich allerdings auch anbieten

Nur wenn das HTML gültiges XML ist, sprich wenn wir über echtes XHTML reden.

herbivore

F
60 Beiträge seit 2010
vor 13 Jahren

da hast du natürlich recht. ich bin einfach von so etwas ausgegangen:

<li><a href="akloader/">akloader/</a></li>
<li><a href="akmenu4/">akmenu4/</a></li>
<li><a href="dldi/">dldi/</a></li>
<li><a href="fonts/">fonts/</a></li>
<li><a href="gbasleep/">gbasleep/</a></li>
<li><a href="language/">language/</a></li>
<li><a href="libelm/">libelm/</a></li>
<li><a href="libior4/">libior4/</a></li>
<li><a href="libiorpg/">libiorpg/</a></li>
<li><a href="license.txt">license.txt</a></li>
<li><a href="makefile">makefile</a></li>
<li><a href="patches/">patches/</a></li>

so große datenmengen werden wohl per tool erzeugt werden, und da ist die wahrscheinlichkeit, dass keine newlines im content sind, zumindest nicht verschwindend gering. aber solange der threadersteller keine beispiele (daten, eigene methode, verwendetes pattern) zeigt, kann man nicht wirklich helfen.

und natürlich geht ein xmlreader auch nur, wenn es wohlgeformtes xml ist - deswegen _könnten _ sich xmlreader auch anbieten.

übrigens liegt die dateigröße nicht nur zwischen 100kb und 100mb, sondern ziemlich genau bei 1.81 - 7.25 mb, wenn wir von utf-8 ausgehen können 😉