CSV-Parser

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Little John

CSV-Parser

Beitrag von Little John »

xxx
Zuletzt geändert von Little John am 07.05.2010 01:23, insgesamt 4-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CSV-Parser

Beitrag von Kiffi »

Hallo Little John,

erstmal vielen Dank für Deinen Code! :allright:

Derzeit komme ich leider nicht dazu, ihn intensiver zu testen. Ich habe gestern Abend mal ganz bräsig
eine eher kleine CSV-Datei (26 MB) parsen lassen. Nach 5 Stunden habe ich dann vorzeitig abgebrochen ;-)

Den meisten Strom wird sicherlich das Erstellen des XML benötigen.
Der Code wird in dieser Form für größere CSV also nicht praktikabel sein.

Noch was:

Code: Alles auswählen

[...]
ElseIf Char = #LF
 Break                 ; Ende des Datensatzes
[...]
stimmt so nicht.

Sowas ist auch möglich:

Code: Alles auswählen

1;2;3
1;"Das ist ein Text
mit Zeilenumbruch";3
1;2;3
da musstu nochmal ran :-)

Grüße ... Kiffi
a²+b²=mc²
Little John

Re: CSV-Parser

Beitrag von Little John »

Hallo Kiffi,

danke für Dein Feedback!
Kiffi hat geschrieben:Ich habe gestern Abend mal ganz bräsig
eine eher kleine CSV-Datei (26 MB) parsen lassen. Nach 5 Stunden habe ich dann vorzeitig abgebrochen ;-)

Den meisten Strom wird sicherlich das Erstellen des XML benötigen.
Der Code wird in dieser Form für größere CSV also nicht praktikabel sein.
Oh gottogott :shock:
Um die Geschwindigkeit hatte ich mich noch nicht so gekümmert, weil ich zunächst "kugelsicheren" Code schreiben wollte. Aber so geht's natürlich nicht. :-(
Ich werde demnächst eine Version mit Linked Lists anstelle eines XML-Baums schreiben, und dann mal die Geschwindigkeiten vergleichen.
Kiffi hat geschrieben:Noch was:

Code: Alles auswählen

[...]
ElseIf Char = #LF
 Break                 ; Ende des Datensatzes
[...]
stimmt so nicht.

Sowas ist auch möglich:

Code: Alles auswählen

1;2;3
1;"Das ist ein Text
mit Zeilenumbruch";3
1;2;3
Ich weiß, das ist doch in meiner kleinen Testdatei "csv_demo.csv" auch so. :-)
Die Stelle die Du oben zitiert hast findet nur Zeilenumbrüche außerhalb von Quotes. Zeilenumbrüche innerhalb von Quotes werden hier behandelt:

Code: Alles auswählen

char = ReadCharacter(fn)
While char <> #QUOTE And Eof(fn) = #False
   content$ + Chr(char)
   char = ReadCharacter(fn)
Wend
Vielleicht kann ich das noch vereinfachen.

Inzwischen ist mir aber noch was anderes aufgefallen. Syntaktisch falsche Felder wie oder

Code: Alles auswählen

"Huhu" xy
werden z.Z. nicht als fehlerhaft erkannt.
Ich habe nirgendwo eine Empfehlung gelesen, wie man damit umgehen sollte. Ich denke am besten bricht die Prozedur die Verarbeitung des Datensatzes an der Stelle ab und liefert einen Fehlercode zurück. Ich habe den Code schon fast fertig entspr. geändert, aber schneller ist er dadurch auch nicht gerade geworden. :D

Gruß, Little John
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CSV-Parser

Beitrag von Kiffi »

Little John hat geschrieben:Die Stelle die Du oben zitiert hast findet nur Zeilenumbrüche außerhalb von Quotes.
au weia! Nicht richtig hingeguckt. Mea culpa! :oops:

Grüße ... Kiffi
a²+b²=mc²
Little John

Re: CSV-Parser

Beitrag von Little John »

Kiffi hat geschrieben:Mea culpa!
Ego te absolvo. :D

Gruß, Little John
Little John

Re: CSV-Parser

Beitrag von Little John »

xxx
Zuletzt geändert von Little John am 07.05.2010 01:24, insgesamt 2-mal geändert.
Little John

Re: CSV-Parser

Beitrag von Little John »

2Kiffi:
Bei mir läuft's "ein bisschen" schneller als bei Dir. Was hast Du denn da angestellt? :mrgreen:

Ernsthaft: Ich vermute, dass das Programm bei Dir in einer Endlosschleife hängengeblieben ist. Vielleicht kannst Du da nochmal nachkucken? Wenn das stimmt, würde ich den Bug natürlich gern beseitigen. Allerdings ist der Code jetzt gegenüber der "5-Stunden-Version" schon verändert (bessere Syntaxfehler-Erkennung). :-)

Gruß, Little John
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: CSV-Parser

Beitrag von Kiffi »

@Little John:

LinkedList-Variante:

Lesen: 24 Sekunden
Schreiben: 5 Sekunden

Respekt! :allright:
Little John hat geschrieben:2Kiffi:
Bei mir läuft's "ein bisschen" schneller als bei Dir. Was hast Du denn da angestellt? :mrgreen:
in der Tat: die 13.2 Sekunden bei Dir sind schon beeindruckend. :shock:

Ich habe offensichtlich einen lahmeren Rechner als Du (siehe Zeiten oben).
Allerdings sollte der Unterschied bei der XML-Variante nicht so krass sein.

Ich teste grade Deinen neuen XML-Code. Ich melde mich in
ein paar Stunden wieder. ;-)

Grüße ... Kiffi
a²+b²=mc²
Antworten