mikrocontroller.net

Forum: PC-Programmierung [suche] CSV-Parser


Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.