# csv Datei mit unterschiedlichen Formatierungen einlesen



## H2SO3- (30. Sep 2008)

Hallo an all die klugen Java Köpfe da draußen,

Ich habe eine ziemlich Nuss zu knacken und hoffe jemand kennt etwas, was dies bereits so etwa kann.

Ich möchte csv dateien einlesen. Soweit ja kein Problem das Problem ist nun folgendes.

- der Seperator für die Spalten kann unterschiedlich sein (, ;     @ usw)
- der seperator für den zeilenumbruch kann unterschiedlich sein (\n oder ;\n zb.)
- mal stehen in der ersten Spalte die Spaltentitel drinne, mal nicht
- der Seperator für die Spalten kann als nicht Seperator drinne stehen. zb. ein string mit einem , wobei der string dann mit "" oder ' ' eingekesselt ist
- ich möchte die csv datei in eine Tabelle schreiben. Diese hat eventuell bereits passende Spalten, oder halt nicht.
- die Typen für die Spalten sollen den tatsächlichen entsprechen. Also nicht alles string sonder halt zb. int oder double. Wobei ich eventuell nicht weiß was es für ein Typ ist
- der Spalten Typ Datum kann sowohl das Amerikanische wie das deutsche Datum enthalten (entweder oder)

So ich denke mal das waren solangsam alle bedingungen die erfüllt werden müssen   

Was natürlich auch noch sein soll, eine csv datei die eine Tabelle mit zb. 20 Spalten und 10.000 Zeilen ergibt soll einigermaßen schnell eingelesen werden können, also keine halbe Stunde brauchen.

Hoffe jemand hat ne Idee dafür, bzw kennt ein Programm was sowas kann.
Ansonsten muss ich da nähmlich von null auf ran  :bahnhof:  :bahnhof:


----------



## lhein (1. Okt 2008)

die Antwort auf all deine Fragen


----------



## H2SO3- (1. Okt 2008)

gegoogelt habe ich schon stunden. Jedoch immer nur programme bzw. code gefunden, der von voraussetzungen ausgeht. Also zb. der seperator ist immer , und kommt in keinem string vor usw. Dies kann ich (siehe oben) leider so nicht gebrauchen.


----------



## SlaterB (1. Okt 2008)

aber du kannst dir sicher vorstellen, dass ein Programm nicht von alleine denken kann,
wenn das Trennzeichen nicht bekannt ist, dann ist selbst für einen Menschen evtl. unmöglich, es zu erkennen, stell dir eine CSV-Datei

,;,;,;,;
;,;,;,;
,;,;,;,;
;,;,;,;
,;,;,;,;

vor 

oder
heute;morgen,gestern;übermorgen,dienstag


entweder muss das Programm mit allen nötigen Infos konfiguriert werden (wie beim Excel-Import)
oder den Inhalt einlesen und selber analysieren = raten, welches Trennzeichen zu wählen ist

teste z.B. für die üblichen Verdächtigen wie ; die Anzahl der Vorkommen pro Zeile,
wenn das jeweils 5 ist, dann sieht das schon gar nicht schlecht aus,

ein Programm, was sowas schon macht, wirst du wahrscheinlich nicht bei google oder sonstwo finden,
falls das deine Frage ist, aber vielleicht weiß ja doch jemand was


----------



## H2SO3- (1. Okt 2008)

ich will gar kein Programm welches selber versucht herauszufinden, was der trenner ist. Dies währe zu gefährlich. Der trenner soll halt mitgegeben werden. Bei den einzelnen csv dateien ist es dem programierer schon klar, was da reinkommt. Es soll also alles mitgeben werden.

Also zb. Csv_Import(Tabelle_wo_daten_reinkommen, zeilenseperator, spaltenseperator, filename_+_Pfad, ...)
{

}

Jedoch auch ein solches konnte ich bisher absolut nicht finden.


----------



## Ark (1. Okt 2008)

Schon mal daran gedacht, das Ding einfach selbst zu schreiben? Wikipediaartikel zu CSV aufgeschlagen, gecheckt und los geht's!

Ark


----------



## SlaterB (1. Okt 2008)

was meinst du dann mit
> Also zb. der seperator ist immer , 

das wird doch wohl irgendwo im Quellcode stehen und kannst du dann gegen was anderes austauschen

wenn du fertige Libraries ohne Quellcode verwendest, wirds natürlich etwas schwieriger,
von obiger Google-Suche führt vieles zu 'CSVReader',

da gibts aber anscheinend auch 
http://javacsv.sourceforge.net/com/csvreader/CsvReader.html#setDelimiter(char)

---------

> Csv_Import(Tabelle_wo_daten_reinkommen [..]

wenn überhaupt wirst du die Daten nur als String herausbekommen,
dass sie an eine JTable oder dessen Model sinnvoll weitergeleitet werden ist fast ausgeschlossen


----------



## H2SO3- (1. Okt 2008)

bin ich ja gerade dabei, nur währs halt schön gewesen, wenn ich das Rad (bzw den csv reader) nicht hätte neu erfinden müssen.


----------



## HoaX (1. Okt 2008)

schau dir mal supercsv an, das kann ziemlich alles mögliche mit csv


----------



## H2SO3- (1. Okt 2008)

subercsv habe ich mir schon angeschaut, soweit ich das sehe, wird da auch davon ausgegangen, das der Seperator , oder ; ist


----------



## SlaterB (1. Okt 2008)

siehe mein vorheriges Posting, eine solche leicht zu ändernde Sache wird nirgendwo fest vorgeschrieben sein


----------



## lhein (1. Okt 2008)

Meine Güte, diese ganze Diskussion hier dauert inzwischen länger als sich einen CSV-Parser für seinen eigenen Zweck zu schreiben. Wo ist das Problem? Mach die dynamischen Bestandteile der CSV konfigurierbar und dann ist gut.


----------



## H2SO3- (1. Okt 2008)

ich glaube auch, ich werde es einfach selber schreiben.

Nur noch ne Frage in die Runde.
Kennt jemand eine gute schnelle Methode den gesamtstring einer datei auszulesen? Meine also nicht mit readLine() sondern den gesamten string inklusive der zeilenseperatoren.

Ist es hier am perfomantesten wenn ich mir alle zeichen in einchar[] packe und mir anschlißend meinen string wieder zusammenbaue oder gibt es hier schon was festes.


----------



## lhein (1. Okt 2008)

Ich würde Dir dringend raten, beim Reader zu bleiben. Die CSV Datei wirst Du sicherlich zeilenweise parsen, von daher bietet sich das an und arbeitet u.a. auch noch resourcenschonender als alles in den Memory zu laden.


----------



## HoaX (1. Okt 2008)

naja, ich hätte keine lust mit escapes usw in den texten rum zu schlagen. das rad wurde schon mehr als einmal neu erfunden, und gerade supercsv lässt kaum wünsche offen.

wert1,"wert 2, und , \" noch, mehr","wert3",...

supercsv unterstützt sogar cellprocessors, so dass du statt nem string z.B. n Date zurückbekommst, klar kannst du auch die trenner angeben, ein blick in die beispiele reicht ...

http://supercsv.sourceforge.net/javadoc/org/supercsv/prefs/CsvPreference.html


----------



## lhein (2. Okt 2008)

Jo, SuperCSV sieht auf den ersten Blick brauchbar aus.


----------

