Einführung in Apache Commons CSV

1. Übersicht

Die CSV-Bibliothek von Apache Commons bietet viele nützliche Funktionen zum Erstellen und Lesen von CSV-Dateien.

In diesem kurzen Tutorial erfahren Sie anhand eines einfachen Beispiels, wie Sie diese Bibliothek verwenden können.

2. Maven-Abhängigkeit

Zu Beginn importieren wir die neueste Version dieser Bibliothek mit Maven:

 org.apache.commons commons-csv 1.4  

Um nach der neuesten Version dieser Bibliothek zu suchen, klicken Sie hier.

3. Lesen einer CSV-Datei

Betrachten Sie die folgende CSV-Datei mit dem Namen book.csv, die die Attribute eines Buches enthält:

author,title Dan Simmons,Hyperion Douglas Adams,The Hitchhiker's Guide to the Galaxy

Mal sehen, wie wir es lesen können:

Map AUTHOR_BOOK_MAP = new HashMap() { { put("Dan Simmons", "Hyperion"); put("Douglas Adams", "The Hitchhiker's Guide to the Galaxy"); } }); String[] HEADERS = { "author", "title"}; @Test public void givenCSVFile_whenRead_thenContentsAsExpected() throws IOException { Reader in = new FileReader("book.csv"); Iterable records = CSVFormat.DEFAULT .withHeader(HEADERS) .withFirstRecordAsHeader() .parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); assertEquals(AUTHOR_BOOK_MAP.get(author), title); } }

Wir lesen die Datensätze einer CSV-Datei, nachdem wir die erste Zeile übersprungen haben, da es sich um den Header handelt.

Es gibt verschiedene Arten von CSVFormat , die das Format der CSV-Datei angeben. Ein Beispiel dafür finden Sie im nächsten Absatz.

4. Erstellen einer CSV-Datei

Mal sehen, wie wir dieselbe CSV-Datei wie oben erstellen können:

public void createCSVFile() throws IOException { FileWriter out = new FileWriter("book_new.csv"); try (CSVPrinter printer = new CSVPrinter(out, CSVFormat.DEFAULT .withHeader(HEADERS))) { AUTHOR_BOOK_MAP.forEach((author, title) -> { printer.printRecord(author, title); }); } }

Die neue CSV-Datei wird mit den entsprechenden Headern erstellt, da wir sie in unserer CSVFormat- Deklaration angegeben haben.

5. Überschriften und Lesespalten

Es gibt verschiedene Möglichkeiten, Header zu lesen und zu schreiben. Ebenso gibt es verschiedene Möglichkeiten, Spaltenwerte zu lesen.

Lassen Sie uns sie einzeln durchgehen:

5.1. Zugriff auf Spalten nach Index

Dies ist die einfachste Methode zum Lesen von Spaltenwerten. Dies kann verwendet werden, wenn die Header für die CSV-Dateien nicht bekannt sind:

Reader in = new FileReader("book.csv"); Iterable records = CSVFormat.DEFAULT.parse(in); for (CSVRecord record : records) { String columnOne = record.get(0); String columnTwo = record.get(1); }

5.2. Zugriff auf Spalten über vordefinierte Überschriften

Dies ist eine intuitivere Möglichkeit, auf Spalten zuzugreifen, als auf Indizes zuzugreifen:

Iterable records = CSVFormat.DEFAULT .withHeader("author", "title").parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); }

5.3. Verwenden von Aufzählungen als Überschriften

Die Verwendung von Strings für den Zugriff auf Spaltenwerte kann fehleranfällig sein. Durch die Verwendung von Enums anstelle von Strings wird der Code standardisierter und verständlicher:

enum BookHeaders { author, title } Iterable records = CSVFormat.DEFAULT .withHeader(BookHeaders.class).parse(in); for (CSVRecord record : records) { String author = record.get(BookHeaders.author); String title = record.get(BookHeaders.title); }

5.4. Überspringen der Kopfzeile

Normalerweise enthalten CSV-Dateien Überschriften in der ersten Zeile. Daher ist es in den meisten Fällen sicher, es zu überspringen und mit dem Lesen aus der zweiten Zeile zu beginnen.

Dadurch werden Header automatisch auf Spaltenwerte zugegriffen:

Iterable records = CSVFormat.DEFAULT .withFirstRowAsHeader().parse(in); for (CSVRecord record : records) { String author = record.get("author"); String title = record.get("title"); }

5.5. Erstellen einer Datei mit Überschriften

Ebenso können wir eine CSV-Datei mit der ersten Zeile erstellen, die die Überschriften enthält:

FileWriter out = new FileWriter("book_new.csv"); CSVPrinter printer = CSVFormat.DEFAULT .withHeader("author", "title").print(out);

6. Fazit

Wir haben die Verwendung der Commons CSV-Bibliothek von Apache anhand eines einfachen Beispiels vorgestellt. Hier können Sie mehr über die Bibliothek lesen.

Der Code für diesen Artikel ist auf Github verfügbar.