Java中CSV处理:OpenCSV与Apache Commons CSV
CSV(逗号分隔值)是存储和交换表格数据最常用的格式之一。Java没有内置的便捷CSV处理库(仅能通过BufferedReader手动解析),因此开发者会使用第三方工具。本文将介绍两个流行的库:OpenCSV和Apache Commons CSV。您将学习如何通过代码示例读取、写入和处理CSV文件。
1. OpenCSV:轻量解析与注解支持
OpenCSV是一个简单高效的CSV处理库。它支持逐行读取、通过注解(@CsvBindByName)映射到Java对象,以及数据写入。
依赖引入(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;
// getters and setters}
// 读取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