Работа с CSV в Java: OpenCSV и Apache Commons CSV
CSV (Comma-Separated Values) — один из самых распространённых форматов для хранения и обмена табличными данными. В Java нет встроенной библиотеки для удобной работы с CSV (только ручной парсинг через BufferedReader), поэтому разработчики используют сторонние инструменты. В этой статье мы рассмотрим две популярные библиотеки: OpenCSV и Apache Commons CSV. Вы узнаете, как читать, записывать и обрабатывать CSV-файлы с примерами кода.
1. OpenCSV: лёгкий парсинг и аннотации
OpenCSV — простая и эффективная библиотека для работы с CSV. Она поддерживает чтение построчно, маппинг на Java-объекты (через аннотации @CsvBindByName), а также запись данных.
Подключение (Maven)
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.9</version>
</dependency>
Чтение CSV в список строк
import com.opencsv.CSVReader;
import java.io.FileReader;
import java.util.List;
public class OpenCsvExample {
public static void main(String[] args) throws Exception {
try (CSVReader reader = new CSVReader(new FileReader("data.csv"))) {
List<String[]> rows = reader.readAll();
for (String[] row : rows) {
System.out.println(String.join(" | ", row));
}
}
}
}
Маппинг на Java-объект
import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.CsvToBeanBuilder;
import java.io.FileReader;
import java.util.List;
public class User {
@CsvBindByName(column = "name")
private String name;
@CsvBindByName(column = "email")
private String email;
// геттеры и сеттеры
}
// Чтение
try (FileReader reader = new FileReader("users.csv")) {
CsvToBean<User> csvToBean = new CsvToBeanBuilder<User>(reader)
.withType(User.class)
.withIgnoreLeadingWhiteSpace(true)
.build();
List<User> users = csvToBean.parse();
users.forEach(u -> System.out.println(u.getName() + " - " + u.getEmail()));
}
Запись CSV
import com.opencsv.CSVWriter;
import java.io.FileWriter;
try (CSVWriter writer = new CSVWriter(new FileWriter("output.csv"))) {
String[] header = {"Name", "Age", "City"};
writer.writeNext(header);
writer.writeNext(new String[]{"Alice", "30", "Moscow"});
writer.writeNext(new String[]{"Bob", "25", "SPb"});
}
2. Apache Commons CSV: гибкость и производительность
Apache Commons CSV — часть экосистемы Apache Commons. Отличается высокой производительностью, поддержкой разных форматов (CSV, TSV, Excel) и настраиваемыми разделителями.
Подключение (Maven)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.11.0</version>
</dependency>
Чтение CSV с заголовками
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.io.Reader;
try (Reader in = new FileReader("data.csv");
CSVParser parser = CSVFormat.DEFAULT
.withFirstRecordAsHeader()
.parse(in)) {
for (CSVRecord record : parser) {
String name = record.get("name");
String email = record.get("email");
System.out.println(name + " : " + email);
}
}
Запись CSV с кастомным разделителем
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import java.io.FileWriter;
import java.io.Writer;
try (Writer out = new FileWriter("output.tsv");
CSVPrinter printer = CSVFormat.TDF.print(out)) { // TDF — табуляция
printer.printRecord("ID", "Product", "Price");
printer.printRecord(1, "Laptop", 1200);
printer.printRecord(2, "Mouse", 25);
}
Работа с разными форматами
Commons CSV поддерживает предопределённые форматы:
CSVFormat.DEFAULT— стандартный CSV (запятая)CSVFormat.EXCEL— формат ExcelCSVFormat.TDF— табуляция (TSV)CSVFormat.RFC4180— строгий RFC-формат