Работа с CSV в Java: полное руководство
CSV (Comma-Separated Values) — один из самых популярных форматов для хранения и обмена табличными данными. В Java существует несколько способов работы с CSV-файлами: от ручного парсинга до использования специализированных библиотек. В этой статье мы рассмотрим основные подходы, включая стандартные средства Java и популярные сторонние библиотеки.
1. Стандартный подход: чтение CSV вручную
Для простых проектов можно обойтись без сторонних библиотек. Используем BufferedReader и String.split():
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class SimpleCSVReader {
public static List<String[]> readCSV(String filePath) {
List<String[]> rows = new ArrayList<>();
String line;
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
while ((line = br.readLine()) != null) {
String[] values = line.split(",");
rows.add(values);
}
} catch (IOException e) {
e.printStackTrace();
}
return rows;
}
public static void main(String[] args) {
List<String[]> data = readCSV("data.csv");
for (String[] row : data) {
System.out.println(String.join(" | ", row));
}
}
}
Недостатки: не обрабатывает кавычки, экранирование запятых внутри полей, разрывы строк. Для продакшена лучше использовать библиотеки.
2. OpenCSV — мощная и простая библиотека
OpenCSV — одна из самых популярных библиотек для работы с CSV в Java. Она решает все проблемы парсинга: кавычки, экранирование, разные разделители.
Установка (Maven):
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.9</version>
</dependency>
Чтение CSV с OpenCSV:
import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvValidationException;
import java.io.FileReader;
import java.io.IOException;
public class OpenCSVReader {
public static void main(String[] args) {
try (CSVReader reader = new CSVReader(new FileReader("data.csv"))) {
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
System.out.println(String.join(" | ", nextLine));
}
} catch (IOException | CsvValidationException e) {
e.printStackTrace();
}
}
}
Запись CSV с OpenCSV:
import com.opencsv.CSVWriter;
import java.io.FileWriter;
import java.io.IOException;
public class OpenCSVWriter {
public static void main(String[] args) {
String[] header = {"Name", "Age", "Email"};
String[] row1 = {"Alice", "30", "alice@example.com"};
String[] row2 = {"Bob", "25", "bob@example.com"};
try (CSVWriter writer = new CSVWriter(new FileWriter("output.csv"))) {
writer.writeNext(header);
writer.writeNext(row1);
writer.writeNext(row2);
} catch (IOException e) {
e.printStackTrace();
}
}
}
3. Apache Commons CSV — гибкость и производительность
Apache Commons CSV — ещё одна мощная библиотека с поддержкой разных форматов (CSV, TSV, Excel).
Установка (Maven):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.11.0</version>
</dependency>
Чтение CSV с Commons 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.IOException;
import java.io.Reader;
public class CommonsCSVReader {
public static void main(String[] args) {
try (Reader reader = new FileReader("data.csv");
CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
.withHeader("Name", "Age", "Email")
.withIgnoreHeaderCase()
.withTrim())) {
for (CSVRecord record : csvParser) {
String name = record.get("Name");
String age = record.get("Age");
String email = record.get("Email");
System.out.printf("%s | %s | %s%n", name, age, email);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Запись CSV с Commons CSV:
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import java.io.FileWriter;
import java.io.IOException;
public class CommonsCSVWriter {
public static void