Eine freie Java-Bibliothek zum Lesen und Schreiben von CSV-Dokumenten ist Apache Commons CSV (https://commons.apache.org/proper/commons-csv/). Sie verwaltet unterschiedliche CSV-Formate wie Microsoft Excel, RFC 4180.
Auf der Webseite gibt es einen Download-Link für das Java-Archiv, doch am einfachsten ist die Einbindung über die Maven-POM-Datei – wir fügen folgende Abhängigkeit hinzu:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.5</version>
</dependency>
Über die Abhängigkeit bekommen wir neue Typen im Paket org.apache.commons.csv. Mit dem CSVPrinter lassen sich CSV-Dokumente korrekt erzeugen, und er behandelt auch Fluchtsymbole korrekt. Erzeugen wir ein CSV-Dokument im Speicher:
StringBuilder appendable = new StringBuilder();
CSVFormat csvFormat = CSVFormat.EXCEL.withHeader( „DisplayName“, „ISO3Language“ );
try ( CSVPrinter csvPrinter = new CSVPrinter( appendable, csvFormat ) ) {
for ( Locale l : Arrays.copyOf( Locale.getAvailableLocales(), 5 ) )
csvPrinter.printRecord( l.getDisplayName(), l.getISO3Language() );
}
Starten wir das Programm erscheint auf der Konsole:
DisplayName,ISO3Language
„“,
Norwegisch Nynorsk,nno
Arabisch (Jordanien),ara
Bulgarisch,bul
Kabuverdianu,kea
Lesen wir das Dokument wieder ein und greifen dazu auf die Klasse CSVParser zurück. Es gibt zwei Ansätze:
- Da CSVParser ein Iterable<CSVRecord> ist, können wir direkt die Zeilen mit dem erweiterten for Das bietet sich für größere Datenmengen an.
- Ist die Anzahl der Daten überschaubar, liefert getRecords() eine gefüllte util.List<CSVRecord> mit alle Zeilen. Das kann praktisch sein, denn eine List hat eine stream()-Methode, sodass die Zeilen praktisch als Stream<CSVRecord> weiterverarbeitet werden können.
Zum Programm:
try ( StringReader reader = new StringReader( appendable.toString() );
CSVParser csvParser = new CSVParser( reader,
CSVFormat.EXCEL.withFirstRecordAsHeader() ) ) {
for ( CSVRecord csvRecord : csvParser )
System.out.printf( „Record=%d – %s, %s%n“,
csvRecord.getRecordNumber(),
csvRecord.get( 0 ), csvRecord.get( 1 ) );
}
Die Ausgabe ist:
Record=1 – ,
Record=2 – Norwegisch Nynorsk, nno
Record=3 – Arabisch (Jordanien), ara
Record=4 – Bulgarisch, bul
Record=5 – Kabuverdianu, kea
IMHO sehr viel schöner ist jackson-dataformat-csv, vor allem mit Mixins. Jackson will man sowieso.