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?
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.
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.
> 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
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.
> 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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.