Wie handhaben dieses Problem andere CSV-Parser?



  • Hi.

    Ich hab eine CSV-Parser nach folgenden Spezifikationen geschrieben:
    http://tools.ietf.org/html/rfc4180

    Das Problem ist jetzt, dass der Parser nur schlecht mit formatierten Quelldateien klarkommt. Man stelle sich z. B. so eine Quelle vor:

    eins;zwei;"drei
    eins;zwei;drei
    eins;zwei;drei
    eins;zwei;drei
    eins;zwei;drei
    

    Die RFC 4180 Spezifikation besagt, dass eine Spalte auch ein CRLF beinhalten kann, wenn sie mit Textqualifizierern (") umschlossen ist.

    Bei einer schlecht formatierten Quelle wie der obigen stellt es jedoch ein Problem dar, weil der Parser ab Zeile 1, Spalte 3 solange alle Zeilen durchgeht, bis er ein abschliessendes " gefunden hat. Da es jedoch keins gibt, macht er das solange bis EOF erreicht ist.

    Bei eine Datenquelle mit Millionen von Zeilen platzt mir irgendwann der Speicher. Der Parser ist "dumm". Ihn intelligenter zu machen hiesse aber auch, ihn langsamer zu machen, schliesslich kann eine vorangehende Analyse der CSV-Formatierung bei einer grossen Datenquelle Ewigkeiten dauern, weil beides nacheinander erfolgt, die Analyse, dann das eigentliche Einlesen.

    Alternativ gibt es die Moeglichkeit, dem Parser eine maximalle Zeichenlaenge pro Spalte mitzugeben, was ich aber auch nicht so toll finde.

    Weiss jemand vielleicht wie andere CSV-Parser das loesen?



  • Du könntest ein Memory Mapped File verwenden. Macht das Leben leichter 🙂



  • Du könntest auch einfach eine Obergrenze für die Feldlänge einführen. Wer sie nicht verwenden will kann sie ja eh auf std::numeric_limits<size_t>::max() setzen.



  • ^^ die spezifikation ist mist, wenn sowas passieren kann. mach's nach einer der 4 anderen specs.
    🙂


Anmelden zum Antworten