Java中CSV处理:OpenCSV、Apache Commons CSV和Java Scanner库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Java中CSV处理:库概览与示例



CSV(逗号分隔值)是交换表格数据最常用的格式之一。尽管看似简单,但在Java中手动解析CSV可能会因引号转义、嵌套逗号以及不同编码而导致错误。本文将介绍三种主要方法:使用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("姓名: " + line[0] + ", 邮箱: " + line[1]); } } }}


示例:映射到Java Bean

public class User {    private String name;    private String email;    // getter和setter方法}

// 带映射的读取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("姓名", "年龄") .print(writer)) {

printer.printRecord("Alice", 30); printer.printRecord("Bob", 25);}

推荐