Frage

Ich habe eine riesige Menge von Protokollzeilen und ich brauche jede Zeile (so die Effizienz zu analysieren sehr wichtig ist).

Jede Protokollzeile ist von der Form

cust_name TIME_START TIME_END (IP oder URL) *

So IP-Adresse, Zeit, Zeit und eine möglicherweise leere Liste von IP-Adressen oder durch ein Semikolon getrennt Urls. Wenn es nur IP oder URL in der letzten Liste ist gibt es keine Trennzeichen. wenn es ist mehr als 1, dann werden sie durch ein Semikolon getrennt.

Ich brauche einen Weg, um diese Linie zu analysieren und sie in eine Datenstruktur zu lesen. TIME_START oder TIME_END könnte entweder Systemzeit oder GMT sein. cust_name könnte auch mehrere Strings durch Leerzeichen getrennt sind.

Ich kann dies tun, indem sie Zeichen für Zeichen zu lesen und im Wesentlichen meine eigenen Parser zu schreiben. Gibt es einen besseren Weg, dies zu tun?

War es hilfreich?

Andere Tipps

Ich habe Erfolg mit Tokenizer Erhöhung für diese Art der Sache. Es hilft Ihnen, einen Eingangsstrom in Token mit benutzerdefinierten Trennzeichen zwischen den Token zu brechen.

Verwenden von regulären Ausdrücken (boost::regex ist eine nette Implementierung für C ++) Sie leicht verschiedene Teile des String trennen kann - cust_name, time_start ... und finden alle, die URLs \ ips

Der zweite Schritt ist ausführlichere Analyse der genannten Gruppen, wenn nötig. Termine zum Beispiel können Sie analysieren mit boost::datetime Bibliothek (Schreiben von benutzerdefinierten Parser, wenn String-Format ist nicht Standard).

Warum wollen Sie diese in C ++ zu tun? Es klingt wie eine offensichtliche Job für so etwas wie Perl.

Betrachten wir ein Regular Expressions-Bibliothek ...

Benutzerdefinierte Eingabe erfordert benutzerdefinierte Parser. Oder beten, dass es eine ideale Welt ist und Fehler sind nicht vorhanden. wenn Sie besonders, wollen die Effizienz haben. einige Code Entsendung von Hilfe sein kann.

für eine solche einfache Grammatik Sie Split verwenden können, werfen Sie einen Blick auf http://www.boost.org/doc/libs/1_38_0/doc/html/string_algo/usage.html#id4002194

UPDATE drastisch verändert beantworten!

  

Ich habe eine riesige Menge von Protokollzeilen und ich brauche jede Zeile zu analysieren (so Effizienz ist sehr wichtig).

Seien Sie sich bewusst sein, dass C ++ wird in Bezug auf die Effizienz in dieser Situation nicht viel helfen. Lassen Sie sich nicht in das Denken getäuscht, dass, nur weil Sie einen schnellen Parsing-Code in C ++ haben, dass Ihr Programm hohe Leistung haben!

Die Effizienz Sie wirklich hier brauchen, ist nicht die Leistung bei der „Maschinencode“ -Ebene des Parsing-Code, sondern auf den gesamten Algorithmus Ebene.

Überlegen Sie, was Sie zu tun versuchen.
Sie haben eine große Textdatei, und Sie mögen jede Zeile in eine Datenstruktur konvertieren,

Speicher große Datenstruktur im Speicher ist sehr ineffizient , egal welche Sprache Sie verwenden!

Was Sie tun müssen, ist „holen“ eine Zeile zu einem Zeitpunkt, wandeln es in eine Datenstruktur, und mit ihr umgehen, dann, und nur, nachdem Sie mit der Datenstruktur fertig sind, gehen Sie und holen die nächste Leitung und wandelt es in eine Datenstruktur, mit ihr umgehen, und wiederholt.

Wenn Sie das tun, haben Sie bereits den größten Engpass gelöst.

Für die Textzeile Parsen, so scheint es, das Format Ihrer Daten ganz simpel ist, überprüfen Sie eine ähnliche Frage, die ich vor einiger Zeit gefragt: C ++ String Parsen (python-Stil)

In Ihrem Fall, nehme ich Sie einen String-Stream verwenden könnte, und verwenden Sie den >> Bediener das nächste „Ding“ in der Zeile zu lesen.

finden Sie unter diese Antwort zum Beispiel Code.

Alternativ (Ich wollte nicht, diesen Teil !! löschen) Wenn Sie dies in Python schreiben konnten wird es viel einfacher sein. Ich weiß nicht, Ihre Situation (es scheint, Sie sind mit C stecken ++), aber immer noch

Sehen Sie in dieser Präsentation für diese Art von Aufgabe zu tun Python-Generator Ausdrücke effizient zu nutzen: http: / /www.dabeaz.com/generators/Generators.pdf

Es ist eine der Mühe wert, zu lesen. Am Schieber 31 beschäftigt er sich mit dem, was etwas sehr ähnlich zu sein scheint, was Sie versuchen zu tun.

Es wird zumindest gibt Ihnen einige Anregungen.
Es zeigt auch ganz stark, dass die Leistung nicht durch den speziellen String-Parsing-Code gewonnen wird, aber der Gesamt Algorithmus.

Sie könnten versuchen, eine einfache lex / yacc verwenden |. Flex / Bison Vokabular diese Art der Eingabe parsen

Der Parser müssen Sie klingt wirklich einfach. einen Blick auf diese. Jede kompilierte Sprache sollte es zu analysieren, in der Lage zu sehr hohe Geschwindigkeit. Dann ist es eine Frage, welche Datenstruktur, die Sie bauen und speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top