Forum: PC-Programmierung [suche] CSV-Parser


von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

ich suche einen konfigurierbaren Flatfile-Parser für csv-ähnliche 
Dateien.

Am besten mal ein vergleichbares Beispiel der Objekte, welche ich 
untersuchen möchte:

Datei_1: exportfile.dat (besteht aus Header, Nutzdaten (Body) und 
Footer)

extractor|1.0|2008-01-15|rülps
N|71|Pflaumenbier|5.5|"extremer Pflaumengeschmack"
U|26|"Altbier"||"läßt Kölner erschaudern"
X|-13|Freibier für umsonst|3,0|man braucht nix zu bezahlen
N|1|Reissdorf Kölsch|4.5|"lecker Gesöff"
biersorten_Köln|10.02.2008 21:52:04|braumeister


Erläuterung:
1. alle Felder in Header, Nutzdaten und Footer werden mit Feldseperator 
"|" getrennt
2. Header, Nutzdaten und Footerzeilen werden mit einem CR-LF oder CR 
oder LF umgebrochen
3. Die einzelnen Bereiche haben folgende Felder mit folgender 
Felddefinition:

H1: Modulname: varchar(15), Pflichtfeld
H2: Versionsnummer: num(2.1), Pflichtfeld
H3: Datum des Moduls, Dateformat=yyyy-mm-dd, Pflichtfeld
H4: Schlüsselwort, varchar(20), Pflichtfeld, Wert="rülps"

B1: Datensatzart: Varchar(1) erlaubte Werte=N,U
B2: Indexnummer: Num(5), erlaubter Wertebereich 0..maxnum1
B3: Biersorte:  varchar(15), Pflichtfeld
B4: Alkoholgehalt: num (3.1), Wertebereich 0.00 ... maxnum2 oder leer
B5: Kommentar: Varchar(40), muß gequoted sein, optional

F1: Filtername: Varchar(15), Pflichtfeld
F2: Extraktionsdatum: Date, format yyyy.mm.dd hh:mm:ss,Pflichtfeld
F3: Benutzerkennung: varchar(20), Pflichtfeld

Aus den genannten Optionen ergibt sich, daß die 3. Nutzdatenzeile 
mehrfach gegen die definierten Syntaxregeln verstößt


Ich bräuchte nun einen Parser (am besten im innersten in Java oder 
perl), dem ich z.B. so aufrufe:

pruefe exportfile.dat bierdefinition.def -verbose
--> Warnung: Nutzdatenzeile 2 enthält in Spalte 4 (Alkoholgehalt) keinen 
Wert
U|26|"Altbier"||"läßt Kölner erschaudern"

--> Fehler: Nutzdatenzeile 3 enthält in Spalte 2 (Indexnummer) folgenden 
Fehler: nicht vom Datentyp "num 3.1"
X|-13|Freibier für umsonst|3,0|man braucht nix zu bezahlen


Ich könnte mir jetzt mit Lex/Bison etc was zusammen basteln, erhoffe mir 
aber, daß da schon mal jemand sowas zusammen geschrieben hat. 
Insbesondere die Datentypenprüfung und Wertebereichsprüfung wäre wichtig 
für mich. Möglicherweise reicht mir schon eine umfangreiche 
EBNF-Notation von "gängigen" Feldelementen


HAt jemand da einen Hinweis für mich?

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

ergänzende Info: Die Definitionsdatei "bierdefinition.def" dürfte in 
etwa so aussehen:

FS        ::= "|"
ZU        ::= CR or LF or CR+LF

Nutzdatei ::= Header + Body + Footer

Header    ::= H1 + FS + H2 + FS + H3 + FS + H4 + ZU
Body      ::= B1 + FS + B2 + FS + B3 + FS + B4 + FS + B5 + ZU
Footer    ::= F1 + FS + F2 + FS + F3 + ZU


H1.Feldname:    ::= Modulname
H1.Datentyp     ::= varchar(15)
H1.Pflicht      ::= ja
H1.Wertebereich ::= a..zA..Z0..9 (irgendein regulärer Ausdruck)

etc.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Es gibt CSV-Module für Perl, Ruby und andere Programmiersprachen 
(allerdings ohne Validierung), das ganze lässt sich aber auch mit 
Stringfunktionen (split) und regulären Ausdrücken einfach von Hand 
machen.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> Es gibt CSV-Module für Perl, Ruby und andere Programmiersprachen
> (allerdings ohne Validierung),

Jep, ich hab auch nix gefunden bisher

> das ganze lässt sich aber auch mit Stringfunktionen (split)
> und regulären Ausdrücken einfach von Hand machen.

Genau dafür müchte ich ja den Parser nutzen. Der soll das Splitten und 
dei regulären Ausdrücke etc. durchführen.

Ich hab so ca. 20 verschiedene Formate, da mach ich lieber 1 * parser 
und 20 Steuerdateien, anstelle 20 programme zusammen zu basteln

von mandrake (Gast)


Lesenswert?

In Java kann man einfach einen StringTokenizer benutzen.
Der Sucht immer nach einem angegebenen Token (bei dir |) und gibt den 
Inhalt dazwischen aus wenn man die Methode next() aufruft, Ist 
hasmortokens() FALSE ist das Ende des Strings erreicht.
Ich habe mir für CSV-Dateien einen eigenen maßgeschneiderten Parser 
gebaut.
War eigentlich eine recht einfache Sache.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> einen eigenen maßgeschneiderten Parser

naja, das ist es ja grade, was ich vermeiden möchte (einen Parser 
maßgeschneidert auf einen bestimmte CSV-Aufbau zurechtgeschnitzt)

> StringTokenizer ...und gibt den Inhalt dazwischen aus wenn man die Methode 
next() aufruft

Auch das ist mir zuwenig. Ich will halt nicht nur Strings in Token 
zerlegen (das ist nicht das Kunststück). Er soll natürlich auch den 
Datentyp prüfen, sowie einen Wertebereich, z.B.

Datentyp = num (1.3) , Wertebereich = 0.00 .. 1.00, mandatory
Datentyp = varchar (5), Wertebereich = [a-zA-Z0-9], optional


Der gesuchte Parser soll hat allgemein sein, und mir Datentyp, 
Wertbereich, Optional/pflicht und weitere Attribute (z.B. Feldtrenner, 
Quotierung) für jedes einzelne Datei-Objekt berücksichtigen

von mandrake (Gast)


Lesenswert?

>Auch das ist mir zuwenig. Ich will halt nicht nur Strings in Token
>zerlegen (das ist nicht das Kunststück). Er soll natürlich auch den
>Datentyp prüfen, sowie einen Wertebereich, z.B.

Genau sowas habe ich gemacht. Zuerst habe ich allerdings als String 
eingelesen. Was man dann mit den Daten macht ist eine andere Sache...
Eine Typerkennung ist im Grunde ja nur eine andere Interpretation der 
Daten.

>Datentyp = num (1.3) , Wertebereich = 0.00 .. 1.00, mandatory
>Datentyp = varchar (5), Wertebereich = [a-zA-Z0-9], optional

In meinem Parser habe ich Fließkomma,Strings,Enumerationen, sowie 
Integerwerte verschiedener Länge unterschieden und auch deren 
Wertebereich überprüft.


>Der gesuchte Parser soll hat allgemein sein, und mir Datentyp,
>Wertbereich, Optional/pflicht und weitere Attribute (z.B. Feldtrenner,
>Quotierung) für jedes einzelne Datei-Objekt berücksichtigen

Mein Parser ist deswegen "maßgeschneidert", da die Erkennung von 
Schlüsselbegriffen hartkodiert ist. Für deine Zwecke wäre eher sowas wie 
ein Wörterbuch wünschenswert um die Flexibilität zu bekommen die du 
brauchst.

In meinem Projekt war die Aufgabe eine Excel-CSV in spezielle 
XML-Dateien sowie diverse Textdateien zu transscribieren. Eine Art 
Code-Generator halt.

Fazit:
Einen fertigen Parser kann ich dir leider nicht anbieten. Ich denke 
jedoch, dass es nicht zu schwer sein sollte einen Parser zu entwickeln, 
der deinen Ansprüchen genügt. Nebenbei kann man wirklich viel dabei 
lernen. Ging mir zu mindest so.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.