Работа с CSV в Java: библиотеки OpenCSV, Apache Commons CSV и Java Scanner

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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 — лучший выбор для маппинга

Рекомендаций