Textdateien parsen - Wie am besten?



  • hallo,

    ich wollte mal nachfragen, was die beste möglichkeit wäre, um textdateien zu parsen.

    meine eigentliche idee ist, dass die datei zeichen für zeichen nach signalwörtern durchsucht wird, und sofern diese gefunden werden, werte aus dieser datei einliest... oder wie macht man das am besten?


  • Mod

    Das geht am besten mit dem allgemeinen Programm für alle Zwecke. Dieses wurde zwar ursprünglich entwickelt, um jede Aufgabe auf die beste Art und Weise zu lösen, kann aber nebenbei auch jegliche Art von Format ohne jede Vorkenntnis optimal Parsen.



  • ähhhhm... ja danke für die antwort.
    ich glaub, du willst mir damit wohl sagen, dass die fragestellung zu wage ist?

    ich will einfach in einer textdatei nach signalwörtern suchen. was ist die beste möglichkeit, um nach diesen signalwörtern zu suchen? jedes zeichen einzeln absuchen, z.b. so:

    // ... sucht nach signalwort "test"
    if( array[i] == 't')
    {
       i++;
       if( array[i] == 'e')
       {
          i++;
          if( array[i] == 's')
          {
             i++;
             if( array[i] == 't')
             {
                printf("'test' gefunden an Position: %d\n",i-3);
             }
          }
       }
    }
    //...
    

    so hab ich das gemeint. was haltet ihr von dieser methode?

    und wie kann man das besser machen?



  • genauer gesagt: es geht um xml.


  • Mod

    !!!???!!! schrieb:

    ich will einfach in einer textdatei nach signalwörtern suchen.

    Datei einlesen (falls sie riesengroß sein sollte gerne auch blockweise, dabei aber an die Grenzen denken), dann strstr benutzen.

    nachtrag schrieb:

    genauer gesagt: es geht um xml.

    Dies hingegen ist ein völlig anderer Fall. Dann musst du das XML parsen. Sonst bekommst du false positives:

    <foo was_du_nicht_suchst="test=" test="Was du eigentlich suchst"/>
    

    Fertige XML-Parser gibt es wie Sand am Meer, da dies quasi ein Standardprojekt ist, an dem sich jeder (einfallslose) Programmierer mal versucht. Ein paar davon sind sogar gut 🙂 . Wenn du selber Spaß dran hast, kannst du es natürlich auch selber entwickeln (selbst Anleitungen dafür sollte es wie Sand am Meer geben).



  • ok.
    also mein plan bisher:
    1. datei öffnen
    2. dateigröße bestimmen mit fseek
    3. genug speicher mit malloc allozieren
    4. gesamten dateiinhalt in den speicher laden
    5. datei schließen
    6. ???

    ja wie soll ich anfangen? erstmal das "<?xml" am dateianfang überprüfen.

    aber jetzt immernoch die grundlegende frage: wie genau geht das eigneltiche parsen vonstatten? soll ich jetzt jedes einzelne zeichen nach "<", bzw. "/>" durchsuchen? ich hab da grad irgendwie keine vorstellung, was die beste möglichkeit ist. oder soll ich doch memcmp oder strcmp aus der stdlib nutzen? es sollte schnell und speichersparend sein.


  • Mod

    Nichts für ungut, aber wenn du selber einen XML-Parser schreiben möchtest, aber überhaupt keinen Plan zum Vorgehen hast, noch dir ein paar grundsätzliche Ideen zum Vorgehen googeln kannst, dann wird das nichts werden. Nutz lieber eine fertige Bibliothek. Für einen selbstgeschriebenen Parser müssten wir die voraussichtlich nämlich jeden Schritt einzeln erklären und vormachen.



  • SeppJ schrieb:

    Nichts für ungut, aber wenn du selber einen XML-Parser schreiben möchtest, aber überhaupt keinen Plan zum Vorgehen hast, noch dir ein paar grundsätzliche Ideen zum Vorgehen googeln kannst, dann wird das nichts werden. Nutz lieber eine fertige Bibliothek. Für einen selbstgeschriebenen Parser müssten wir die voraussichtlich nämlich jeden Schritt einzeln erklären und vormachen.

    hört sich für mich eher so an, als wüsstest du selbst nicht so genau, wie man das am besten macht...


  • Mod

    !!!???!!! schrieb:

    hört sich für mich eher so an, als wüsstest du selbst nicht so genau, wie man das am besten macht...

    Ich habe konkret für XML noch keinen Parser geschrieben, nein. Aber ich wüsste aus allgemeiner Erfahrung, wie ich beim Parserbau für eine Grammatik dieser Art anfangen würde und ich wüsste, wie ich meine Wissenslücken (die vor allem das Format selber betreffen) selbstständig schließen könnte und ich wüsste, dass ich es dabei so gut verstehen würde, dass ich es hinterher jemandem beibringen könnte und ich würde auch schätzen, dass ich dies alles noch heute Abend schaffen könnte, wenn ich Lust hätte. Aber wenn du so klug bist, dann mach es eben alleine. 👎



  • SeppJ schrieb:

    !!!???!!! schrieb:

    hört sich für mich eher so an, als wüsstest du selbst nicht so genau, wie man das am besten macht...

    Ich habe konkret für XML noch keinen Parser geschrieben, nein. Aber ich wüsste aus allgemeiner Erfahrung, wie ich beim Parserbau für eine Grammatik dieser Art anfangen würde und ich wüsste, wie ich meine Wissenslücken (die vor allem das Format selber betreffen) selbstständig schließen könnte und ich wüsste, dass ich es dabei so gut verstehen würde, dass ich es hinterher jemandem beibringen könnte und ich würde auch schätzen, dass ich dies alles noch heute Abend schaffen könnte, wenn ich Lust hätte. Aber wenn du so klug bist, dann mach es eben alleine. 👎

    naja, du selbst hast oben (indirekt) gesagt, dass so ein parser keine große sache ist. daher nehme ich an, dass du mir innerhalb von 3 minuten ungefähr erklären kannst, wie das geht. stattdessen soll ich mich jetzt durch irgendeinen überladenen und hässlich geschriebnenen c-code wühlen 🙄


  • Mod

    !!!???!!! schrieb:

    naja, du selbst hast oben (indirekt) gesagt, dass so ein parser keine große sache ist.

    Dann hast du mich komplett falsch verstanden. Wenn man dies das erste Mal macht, dann ist das eine verdammt große Sache. Ich könnte zwar sicherlich innerhalb von ein paar Stunden einen einfachen Parser schreiben, weil ich allgemein weiß, wie ich ungefähr vorzugehen habe. Aber dir das Nötigste beizubringen, wenn du noch überhaupt nichts über Parserbau weißt (und mit der C-Standardbiblitohek scheinst du auch nicht ganz fit zu sein, oder?), das würde Tage bis Wochen benötigen, deswegen rate ich dir, erst einmal eine fertige Lösung zu benutzen. Die einfallslosen Programmierer (wenn sie gerade keine Game-Engine schreiben) programmieren XML-Parser, eben weil es eine Herausforderung ist, dies halbwegs gut zu machen.

    stattdessen soll ich mich jetzt durch irgendeinen überladenen und hässlich geschriebnenen c-code wühlen

    Wo liest du das denn nun schon wieder raus? Du sollst dir eine gute Standardlösung wie libxml* schnappen und diese benutzen. Nicht nachprogrammieren.

    *: Da ich normalerweise C++ mache, weiß ich nicht, welches die wirklich guten und verbreiteten Lösungen für C sind. Aber Google und Wikipedia wecken den Eindruck, dass libxml dazu gehört.



  • ok gut.

    hättest du wenigstens noch ein paar nützliche links zum parserbau? egal ob xml oder nicht, es geht ja erstmal um den grundgedanken.

    und wie kommst du auf die idee, dass ich c-stdlib nicht so fit bin?


  • Mod

    !!!???!!! schrieb:

    hättest du wenigstens noch ein paar nützliche links zum parserbau?

    Nun, Google und Wikipedia natürlich.
    http://en.wikipedia.org/wiki/Parsing#Programming_languages
    Von da aus bekommst du auch Tipps für Literatur. Und dann heißt es Üben, damit du das mindestens einmal in der Praxis selber umsetzt. Vielleicht nicht gleich beim ersten Versuch mit XML, ein typisches (relativ einfaches aber trotzdem herausforderndes) Beispiel ist das Parsen von mathematischen Ausdrücken aus +, -, *, / und Klammern.

    und wie kommst du auf die idee, dass ich c-stdlib nicht so fit bin?

    Dein Versuch das Vorkommen einer Zeichenkette zu finden.



  • SeppJ schrieb:

    Die einfallslosen Programmierer...

    Was hat Einfallslosigkeit mit dem Programmieren eines eigenen XML-Parsers zu tun? 😉



  • ok, SeppJ, ich entschuldige mich hiermit bei dir. ich habe die komplexität eines parsers unterschätzt.

    im grunde scheint parserbau die "lightversion" vom compilerbau zu sein (bzw. parserbau ist bestandteil vom compilerbau).

    für alle, die an parserbau interessiert sind oder über google auf diese beiträge gestoßen sind, hier einige nützliche links:
    http://de.wikipedia.org/wiki/LR-Parser

    hier finden sich unter "Weblinks" noch einige gute links.


Anmelden zum Antworten