Работа с CSV в Java: обзор библиотек и примеры
CSV (Comma-Separated Values) — один из самых распространённых форматов для обмена табличными данными. Несмотря на кажущуюся простоту, ручной парсинг CSV в Java может привести к ошибкам из-за экранирования кавычек, вложенных запятых и разных кодировок. В этой статье мы рассмотрим три основных подхода: использование OpenCSV, Apache Commons CSV и стандартного java.util.Scanner.
1. OpenCSV — гибкая и популярная библиотека
OpenCSV — это лёгкая библиотека с открытым исходным кодом, которая поддерживает чтение и запись CSV, TSV и других разделителей. Она автоматически обрабатывает экранирование, кавычки и многострочные поля.
Подключение (Maven)
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.9</version>
</dependency>
Пример: чтение CSV в список объектов
import com.opencsv.CSVReader;
import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
import java.io.FileReader;
import java.util.List;
public class OpenCSVExample {
public static void main(String[] args) throws Exception {
try (FileReader reader = new FileReader("users.csv")) {
// Парсинг вручную
CSVReader csvReader = new CSVReader(reader);
String[] line;
while ((line = csvReader.readNext()) != null) {
System.out.println("Name: " + line[0] + ", Email: " + line[1]);
}
}
}
}
Пример: маппинг на Java Bean
public class User {
private String name;
private String email;
// геттеры и сеттеры
}
// Чтение с маппингом
try (FileReader reader = new FileReader("users.csv")) {
HeaderColumnNameMappingStrategy<User> strategy = new HeaderColumnNameMappingStrategy<>();
strategy.setType(User.class);
CsvToBean<User> csvToBean = new CsvToBeanBuilder<User>(reader)
.withMappingStrategy(strategy)
.build();
List<User> users = csvToBean.parse();
}
2. Apache Commons CSV — стандарт от Apache
Apache Commons CSV — часть экосистемы Apache Commons. Предоставляет готовые форматы (RFC 4180, Excel, MySQL) и потоковую обработку.
Подключение (Maven)
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.11.0</version>
</dependency>
Пример: чтение с заголовками
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;
public class CommonsCSVExample {
public static void main(String[] args) throws Exception {
try (Reader reader = new FileReader("data.csv");
CSVParser parser = CSVFormat.DEFAULT
.withFirstRecordAsHeader()
.parse(reader)) {
for (CSVRecord record : parser) {
String id = record.get("ID");
String value = record.get("Value");
System.out.println(id + " -> " + value);
}
}
}
}
Запись CSV
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import java.io.FileWriter;
import java.io.Writer;
try (Writer writer = new FileWriter("output.csv");
CSVPrinter printer = CSVFormat.DEFAULT
.withHeader("Name", "Age")
.print(writer)) {
printer.printRecord("Alice", 30);
printer.printRecord("Bob", 25);
}
3. Стандартный java.util.Scanner (без внешних зависимостей)
Если проект не допускает сторонних библиотек, можно использовать Scanner и String.split(). Однако этот метод не обрабатывает кавычки и запятые внутри полей.
import java.io.File;
import java.util.Scanner;
public class ScannerCSV {
public static void main(String[] args) throws Exception {
Scanner scanner = new Scanner(new File("simple.csv"));
scanner.useDelimiter("\n");
while (scanner.hasNext()) {
String line = scanner.next();
String[] fields = line.split(",");
for (String field : fields) {
System.out.print(field.trim() + " | ");
}
System.out.println();
}
scanner.close();
}
}
Важно: split(",") сломается, если поле содержит запятую внутри кавычек. Для простых файлов без экранирования этого достаточно.
Сравнение библиотек
- OpenCSV — лучший выбор для маппинга
Также в библиотеке
WebSocket библиотеки для Node.js: ws, Socket.IO и uWebSockets.js
neverthrow для TypeScript: полное руководство с примерами
Машинное обучение на Go: библиотеки для Golang (ML, нейросети, NLP)
Интернационализация (i18n) в TypeScript: библиотека i18next