Перейти к основному содержимому

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

· 3 мин. чтения

1. Обзор

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

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

2. Зависимость от Maven

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

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.4</version>
</dependency>

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

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

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

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

Давайте посмотрим, как мы можем это прочитать:

Map<String, String> 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<CSVRecord> 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<CSVRecord> records = CSVFormat.DEFAULT.parse(in);
for (CSVRecord record : records) {
String columnOne = record.get(0);
String columnTwo = record.get(1);
}

5.2. Доступ к столбцам по предопределенным заголовкам

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

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

5.3. Использование перечислений в качестве заголовков

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

enum BookHeaders {
author, title
}

Iterable<CSVRecord> 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<CSVRecord> 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. Заключение

Мы представили использование библиотеки Apache Commons CSV на простом примере. Подробнее о библиотеке можно прочитать здесь .

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