Einführung in Apache Commons CSV

Einführung in Apache Commons CSV

1. Überblick

Apache Commons CSV library 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 werden wir die neueste Version dieser Bibliothek mit Maven importieren:


    org.apache.commons
    commons-csv
    1.4

So suchen Sie nach der neuesten Version dieser Bibliothek:go here.

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 vonCSVFormat, 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 unsererCSVFormat-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 grundlegendste 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 dies bei Indizes der Fall ist:

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 vonStrings 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, das Dokument zu überspringen und mit dem Lesen ab der zweiten Zeile zu beginnen.

Dadurch werden Header automatisch erkannt, die auf Spaltenwerte zugreifen:

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. Sie können mehr über die Bibliothekhere lesen.

Der Code für diesen Artikel istover on Github verfügbar.