Können Sie eine Java-Bibliothek zum Lesen (und möglicherweise zu schreiben) CSV-Dateien empfehlen? [geschlossen]
Frage
Können Sie eine Java-Bibliothek zum Lesen empfehlen, Parsing, Validierung und Mapping-Zeilen in einem Comma Separated Value (CSV-Datei) auf Java-Wert-Objekte (Java Beans)?
Lösung
Wir haben verwendet http://opencsv.sourceforge.net/ mit gutem Erfolg
ich stieß auch auf eine andere Frage mit guten Verbindungen: Java lib oder App CSV to XML-Datei?
konvertierenAndere Tipps
Super-CSV ist eine gute Wahl für das Lesen / Parsing, Validierung und Mapping CSV-Dateien zu POJOs!
Wir (die Super-CSV-Team) haben gerade eine neue Version veröffentlicht (Sie können es herunterladen rel="noreferrer"> von Sourceforge oder Maven).
Lesen einer CSV-Datei
Das folgende Beispiel verwendet CsvDozerBeanReader
(einen neuen Leser wir gerade veröffentlicht haben, die Dozer für Bean-Mapping mit Tief Mapping und indexbasierte Mapping-Unterstützung) - es am Beispiel von Website basieren. Wenn Sie nicht die Funktionalität Dozer benötigen (oder Sie wollen nur eine einfache Standalone-Abhängigkeit), dann können Sie CsvBeanReader
verwenden, anstatt (siehe diese Codebeispiel ).
Beispiel CSV-Datei
Hier ist ein Beispiel CSV-Datei, die Antworten auf eine Umfrage darstellt. Es verfügt über einen Header und 3 Reihen von Daten, die alle mit 8 Spalten.
age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars
Definieren der Zuordnung von CSV zu POJO
Jede Reihe von CSV wird in einen SurveyResponse Klasse, von denen jeder hat eine Liste der Antwort s. Damit die Zuordnung sollen, Ihre Klassen gültig sein Javabeans arbeiten (das heißt eine Standard kein argument Konstruktor und haben Getter / Setter für jedes Feld definiert).
In Super CSV definieren Sie die Zuordnung mit einem einfachen String-Array -. Jedes Element des Arrays entspricht einer Spalte in der CSV-Datei
Mit CsvDozerBeanMapper
können Sie:
-
einfache Feldzuordnungen (z
firstName
) -
tief Mappings (z
address.country.code
) -
indexiert mapping (z.B.
middleNames[1]
- zero basierten Index für Arrays oder Sammlungen) -
deep + indexierten mapping (z.B.
person.middleNames[1]
)
Im Folgenden die Feldzuordnung für dieses Beispiel - es verwendet eine Kombination aus diesen:
private static final String[] FIELD_MAPPING = new String[] {
"age", // simple field mapping (like for CsvBeanReader)
"consentGiven", // as above
"answers[0].questionNo", // indexed (first element) + deep mapping
"answers[0].answer",
"answers[1].questionNo", // indexed (second element) + deep mapping
"answers[1].answer",
"answers[2].questionNo",
"answers[2].answer" };
Konvertierung und Validierung
Super CSV hat eine nützliche Bibliothek von Zellenprozessoren , die verwendet werden können, um die Saiten zu konvertieren aus der CSV-Datei in anderen Datentypen (zB Datum, Integer) oder Beschränkungsvalidierungs (zB zwingend / optional, Regex Matching, Bereichsprüfung) zu tun.
Mit Cell-Prozessoren ist völlig optional -. Ohne sie jede Spalte von CSV wird ein String sein, so dass jedes Feld muss ein String sein auch
Im Folgenden ist der Cell-Prozessor-Konfiguration für das Beispiel. Wie bei der Feldzuordnung repräsentiert jedes Element des Arrays eine CSV-Spalte. Es zeigt, wie Cell-Prozessoren die CSV-Daten in den Datentyp des Feldes verändern können, und wie sie miteinander verkettet werden.
final CellProcessor[] processors = new CellProcessor[] {
new Optional(new ParseInt()), // age
new ParseBool(), // consent
new ParseInt(), // questionNo 1
new Optional(), // answer 1
new ParseInt(), // questionNo 2
new Optional(), // answer 2
new ParseInt(), // questionNo 3
new Optional() // answer 3
};
Lesen
mit Super-CSV Lesen ist sehr flexibel: Sie Ihre eigenen Reader
liefern (so können Sie aus einer Datei lesen, die Classpath, eine Zip-Datei, usw.) und das Trennzeichen und Anführungszeichen sind konfigurierbar über Website finden!
kann ich empfehlen SuperCSV . Einfach zu bedienen, und tat alles, was ich brauchte.
Hey, ich habe ein Open-Source-Projekt für die: JFileHelpers . Ich denke, der Hauptvorteil ist, dass es verwendet Java Annotations, werfen Sie einen Blick:
Wenn Sie diese Bohne:
@FixedLengthRecord()
public class Customer {
@FieldFixedLength(4)
public Integer custId;
@FieldAlign(alignMode=AlignMode.Right)
@FieldFixedLength(20)
public String name;
@FieldFixedLength(3)
public Integer rating;
@FieldTrim(trimMode=TrimMode.Right)
@FieldFixedLength(10)
@FieldConverter(converter = ConverterKind.Date,
format = "dd-MM-yyyy")
public Date addedDate;
@FieldFixedLength(3)
@FieldOptional
public String stockSimbol;
}
Und will diese Datei analysieren:
....|....1....|....2....|....3....|....4
1 Antonio Pereira 10012-12-1978ABC
2 Felipe Coury 201-01-2007
3 Anderson Polga 4212-11-2007DEF
Alles, was Sie tun müssen, ist dies:
FileHelperEngine<Customer> engine =
new FileHelperEngine<Customer>(Customer.class);
List<Customer> customers =
new ArrayList<Customer>();
customers = engine.readResource(
"/samples/customers-fixed.txt");
Auch er unterstützt Master-Detail, das Datum und Formatkonvertierung, und vieles mehr. Lassen Sie mich wissen, was Sie denken!
Mit freundlichen Grüßen!
Ich finde Flatpack wirklich mit dem Umgang mit schrulligen CSV-Dateien (entkommen, Zitate, schlechte Aufzeichnungen, gut zu sein, etc.)
Die CSV to XML Frage Datei gefragt vorher scheint alle meine Fragen zu beantworten.
OpenCSV ( http://opencsv.sourceforge.net/ ) aber auch auf dem Java Beans Bindung eines mit Spalte Position Mapping-Strategie
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);
JSEFA ( http://jsefa.sourceforge.net ) scheint auch alles zu tun, ich brauche - vor allem Bindung an Java-Objekte - neben der Unterstützung FLR und XML
Siehe CVSBeans