Können Sie eine Java-Bibliothek zum Lesen (und möglicherweise zu schreiben) CSV-Dateien empfehlen? [geschlossen]

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

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)?

War es hilfreich?

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?

konvertieren

Andere 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

Ich habe von Java guten Erfolg sowohl das Parsen und Schreiben von CSV-Dateien hat mit OpenCSV . Wenn Sie möchten, Excel-kompatible Tabellenkalkulation mit Java, die POI Bibliothek von Apache lesen oder zu schreiben, ist der Weg zu gehen .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top