Введение в Apache Commons CSV

Введение в Apache Commons CSV

1. обзор

Apache Commons CSV library имеет множество полезных функций для создания и чтения файлов CSV.

В этом кратком руководстве мы увидим, как использовать эту библиотеку, на простом примере.

2. Maven Dependency

Для начала мы импортируем последнюю версию этой библиотеки, используя Maven:


    org.apache.commons
    commons-csv
    1.4

Чтобы проверить наличие самой последней версии этой библиотеки -go here.

3. Чтение файла CSV

Рассмотрим следующий CSV-файл с именем book.csv, содержащий атрибуты книги:

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

Посмотрим, как это можно прочитать:

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);
    }
}

Мы читаем записи файла CSV после пропуска первой строки, поскольку это заголовок.

Существуют разные типыCSVFormat, определяющие формат файла CSV, пример которого вы можете увидеть в следующем абзаце.

4. Создание файла CSV

Давайте посмотрим, как мы можем создать тот же файл CSV, что и выше:

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);
        });
    }
}

Новый файл CSV будет создан с соответствующими заголовками, потому что мы указали их в нашем объявленииCSVFormat.

5. Заголовки и столбцы для чтения

Есть разные способы чтения и записи заголовков. Точно так же существуют разные способы чтения значений столбцов.

Давайте рассмотрим их один за другим:

5.1. Доступ к столбцам по индексу

Это самый простой способ чтения значений столбцов. Это может использоваться, когда заголовки для файлов CSV неизвестны:

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. Доступ к столбцам по предопределенным заголовкам

Это более интуитивный способ доступа к столбцам по сравнению с доступом по индексам:

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. Использование перечислений в качестве заголовков

ИспользованиеStrings для доступа к значениям столбцов может быть подвержено ошибкам. Использование Enums вместо Strings сделает код более стандартизированным и более простым для понимания:

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. Пропуск строки заголовка

Обычно файлы CSV содержат заголовки в первой строке. Следовательно, в большинстве случаев его можно пропустить и начать чтение со второго ряда.

Это автоматически определит заголовки доступа к значениям столбцов:

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

5.5. Создание файла с заголовками

Точно так же мы можем создать файл CSV с первой строкой, содержащей заголовки:

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

6. Заключение

Мы представили использование CSV-библиотеки Apache Commons на простом примере. Вы можете узнать больше о библиотекеhere.

Код для этой статьи доступенover on Github.