Kann mir jemand eine einfache API empfehlen, mit der ich eine CSV-Eingabedatei lesen, einige einfache Transformationen durchführen und sie dann schreiben kann?
Ich habe die Sandbox Commons CSV schon seit einiger Zeit verwendet und nie ein Problem festgestellt. Ich hoffe wirklich, dass sie es zum vollen Ansehen befördern und es aus dem Sandkasten holen.
Alex Marshall
3
@ bmatthews68 der Sandbox-Link ist nicht mehr vorhanden - es sieht so aus, als wäre er in Apache Commons verschoben worden (ich habe den Link auch in der Antwort bearbeitet)
// wenn die erste Zeile der Header ist
String [] header = reader.readNext ();
// iteriere über reader.readNext bis es null zurückgibt
String [] line = reader.readNext ();
Bei den Antworten auf eine andere Frage gab es einige andere Möglichkeiten .
Leider wird der neueste Download von OpenCSV (v2.2 zum Zeitpunkt des Kommentars) nicht kompiliert und es wird keine vorgefertigte Binärdatei bereitgestellt.
Opyate
9
Das Paket, das ich von SourceForge heruntergeladen habe, hatte eine Binärdatei im Bereitstellungsordner.
Mike Sickler
8
Wenn Sie maven verwenden, beachten Sie bitte, dass der Abhängigkeitscode auf der offiziellen Website die Versionsdeklaration "2.0" enthält, die einige Fehler enthält, die Version 2.3 jedoch in den Repositorys aktualisiert ist.
Broundee
Diese Bibliothek schreibt keine Datei in einem separaten Thread, nein?
Update: Der Code in dieser Antwort ist für Super CSV 1.52. Aktualisierte Codebeispiele für Super CSV 2.4.0 finden Sie auf der Projektwebsite:
http://super-csv.github.io/super-csv/index.html
Ihr Code wurde nicht kompiliert, daher habe ich einige Korrekturen eingereicht. Außerdem funktioniert ParseDate () nicht richtig, daher habe ich es ersetzt, um einen String zu lesen. Es kann später analysiert werden.
1
Große Einschränkung: SuperCSV ist nicht threadsicher, ich werde mich an Jackson wenden, obwohl es möglicherweise mehr
funktionsbeschränkt ist
SuperCsv erlaubt auch nicht die Verwendung von Multimaps. Wäre schön zu sehen, dass es mit MultiMaps funktioniert.
Sid
19
Wenn ich die Beschreibung des CSV-Formats lese, habe ich das Gefühl, dass die Verwendung einer Bibliothek eines Drittanbieters weniger Kopfschmerzen verursacht als das Schreiben selbst:
Ich habe die aufgelisteten Bibliotheken anhand einer Checkliste verglichen. OpenCSV war für mich (YMMV) ein Gewinner mit folgenden Ergebnissen:
+ maven
+ maven - release version // had some cryptic issues at _Hudson_ with snapshot references => prefer to be on a safe side+ code examples
+ open source // as in "can hack myself if needed"+ understandable javadoc // as opposed to eg javadocs of _genjava gj-csv_+ compact API // YAGNI (note *flatpack* seems to have much richer API than OpenCSV)- reference to specification used // I really like it when people can explain what they're doing- reference to _RFC 4180_ support // would qualify as simplest form of specification to me- releases changelog // absence is quite a pity, given how simple it'd be to get with maven-changes-plugin // _flatpack_, for comparison, has quite helpful changelog+ bug tracking
+ active // as in "can submit a bug and expect a fixed release soon"+ positive feedback // Recommended By 51 users at sourceforge (as of now)
Das einzige Problem mit dieser Bibliothek ist, dass Sie keine CSV-Dateien mit Windows-Zeilenabschlusszeichen ( \r\n) ausgeben können, wenn Sie nicht unter Windows ausgeführt werden. Der Autor hat jahrelang keine Unterstützung geleistet. Ich musste es gabeln, um diese fehlende Funktion zuzulassen
Mosty Mostacho
6
Für die letzte Unternehmensanwendung, an der ich gearbeitet habe, um eine bemerkenswerte Menge an CSV zu verarbeiten - vor ein paar Monaten - habe ich SuperCSV bei sourceforge verwendet und fand es einfach, robust und problemlos.
+1 für SuperCSV, aber es gibt einige böse Fehler, die noch nicht behoben sind, neue Fehler werden derzeit nicht behandelt und die letzte Version ist fast zwei Jahre alt. Wir verwenden jedoch problemlos eine gepatchte / modifizierte Version in der Produktion.
MRalwasser
2
@MRalwasser Super CSV 2.0.0-beta-1 wurde kürzlich veröffentlicht. Es enthält viele Fehlerkorrekturen und neue Funktionen (einschließlich Maven-Unterstützung und einer neuen Dozer-Erweiterung für die Zuordnung verschachtelter Eigenschaften und Arrays / Sammlungen)
James Bassett
1
@ Hound-Dog Vielen Dank für das Update, ich habe die neue Beta bereits bemerkt und bin froh, das Projekt lebend zu sehen - obwohl mir die Häufigkeit der Commits immer noch ein wenig Angst macht (fast alle Commits nur an wenigen Tagen). Aber ich werde einen Blick darauf werfen. Gibt es ein voraussichtliches Veröffentlichungsdatum für das endgültige 2.0?
MRalwasser
2
@MRalwasser Ich bin im Moment der einzige Entwickler und habe Vollzeitarbeit, daher arbeite ich immer daran, wenn ich ein freies Wochenende bekomme - daher die sporadischen Commits :) Fast 1000 SF-Downloads der Beta jetzt und keine Fehler, Ich freue mich also auf eine endgültige Veröffentlichung Anfang nächsten Monats. Wenn Sie Ideen für zukünftige Funktionen haben, teilen Sie uns dies bitte mit.
James Bassett
1
SuperCSV ist zu diesem Zeitpunkt nicht threadsicher, was es imho nicht wirklich robust macht
ZiglioUK
5
Sie können csvreader api verwenden und von folgendem Speicherort herunterladen:
/************* For Writing ***************************/import java.io.File;import java.io.FileWriter;import java.io.IOException;import com.csvreader.CsvWriter;publicclassCsvWriterAppendExample{publicstaticvoid main(String[] args){String outputFile ="users.csv";// before we open the file check to see if it already existsboolean alreadyExists =newFile(outputFile).exists();try{// use FileWriter constructor that specifies open for appendingCsvWriter csvOutput =newCsvWriter(newFileWriter(outputFile,true),',');// if the file didn't already exist then we need to write out the header lineif(!alreadyExists){
csvOutput.write("id");
csvOutput.write("name");
csvOutput.endRecord();}// else assume that the file already has the correct header line// write out a few records
csvOutput.write("1");
csvOutput.write("Bruce");
csvOutput.endRecord();
csvOutput.write("2");
csvOutput.write("John");
csvOutput.endRecord();
csvOutput.close();}catch(IOException e){
e.printStackTrace();}}}
Das CSV-Format klingt für StringTokenizer recht einfach, kann jedoch komplizierter werden. Hier in Deutschland wird ein Semikolon als Begrenzer verwendet und Zellen, die Begrenzer enthalten, müssen maskiert werden. Mit StringTokenizer werden Sie nicht so einfach damit umgehen.
Wenn Sie beabsichtigen, CSV aus Excel zu lesen, gibt es einige interessante Eckfälle. Ich kann mich nicht an alle erinnern, aber der Apache Commons CSV war nicht in der Lage, richtig damit umzugehen (zum Beispiel mit URLs).
Stellen Sie sicher, dass Sie die Excel-Ausgabe überall mit Anführungszeichen, Kommas und Schrägstrichen testen.
Antworten:
Apache Commons CSV
Schauen Sie sich Apache Common CSV an .
Diese Bibliothek liest und schreibt verschiedene Varianten von CSV , einschließlich des Standard- RFC 4180 . Liest / schreibt auch tabulatorgetrennte Dateien.
quelle
Ich habe in der Vergangenheit OpenCSV verwendet .
Bei den Antworten auf eine andere Frage gab es einige andere Möglichkeiten .
quelle
Update: Der Code in dieser Antwort ist für Super CSV 1.52. Aktualisierte Codebeispiele für Super CSV 2.4.0 finden Sie auf der Projektwebsite: http://super-csv.github.io/super-csv/index.html
Das SuperCSV-Projekt unterstützt direkt das Parsen und die strukturierte Manipulation von CSV-Zellen. Unter http://super-csv.github.io/super-csv/examples_reading.html finden Sie z
eine Klasse gegeben
und dass Sie eine CSV-Datei mit einem Header haben. Nehmen wir den folgenden Inhalt an
Anschließend können Sie eine Instanz der UserBean erstellen und diese mit Werten aus der zweiten Zeile der Datei mit dem folgenden Code füllen
unter Verwendung der folgenden "Manipulationsspezifikation"
quelle
Wenn ich die Beschreibung des CSV-Formats lese, habe ich das Gefühl, dass die Verwendung einer Bibliothek eines Drittanbieters weniger Kopfschmerzen verursacht als das Schreiben selbst:
Wikipedia listet 10 oder etwas Bekanntes auf:
Ich habe die aufgelisteten Bibliotheken anhand einer Checkliste verglichen. OpenCSV war für mich (YMMV) ein Gewinner mit folgenden Ergebnissen:
quelle
Wir verwenden JavaCSV , es funktioniert ziemlich gut
quelle
\r\n
) ausgeben können, wenn Sie nicht unter Windows ausgeführt werden. Der Autor hat jahrelang keine Unterstützung geleistet. Ich musste es gabeln, um diese fehlende Funktion zuzulassenFür die letzte Unternehmensanwendung, an der ich gearbeitet habe, um eine bemerkenswerte Menge an CSV zu verarbeiten - vor ein paar Monaten - habe ich SuperCSV bei sourceforge verwendet und fand es einfach, robust und problemlos.
quelle
Sie können csvreader api verwenden und von folgendem Speicherort herunterladen:
http://sourceforge.net/projects/javacsv/files/JavaCsv/JavaCsv%202.1/javacsv2.1.zip/download
oder
http://sourceforge.net/projects/javacsv/
Verwenden Sie den folgenden Code:
Schreiben / Anhängen an CSV-Datei
Code:
quelle
Es gibt auch das CSV / Excel-Dienstprogramm . Es wird davon ausgegangen, dass alle diese Daten tabellenartig sind und Daten von Iteratoren liefern.
quelle
Das CSV-Format klingt für StringTokenizer recht einfach, kann jedoch komplizierter werden. Hier in Deutschland wird ein Semikolon als Begrenzer verwendet und Zellen, die Begrenzer enthalten, müssen maskiert werden. Mit StringTokenizer werden Sie nicht so einfach damit umgehen.
Ich würde für http://sourceforge.net/projects/javacsv gehen
quelle
Wenn Sie beabsichtigen, CSV aus Excel zu lesen, gibt es einige interessante Eckfälle. Ich kann mich nicht an alle erinnern, aber der Apache Commons CSV war nicht in der Lage, richtig damit umzugehen (zum Beispiel mit URLs).
Stellen Sie sicher, dass Sie die Excel-Ausgabe überall mit Anführungszeichen, Kommas und Schrägstrichen testen.
quelle