Commons CSV 示例:解析 CSV 文件

CSV
本文将介绍使用 Commons CSV 解析 CSV 文件。

Maven 依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.9.0</version>
</dependency>

CSV 文件

将下面内容保存到 demo.csv 文件中,且将 demo.csv 文件拷贝到 maven 项目的 src/main/resources 目录。CSV 文件内容如下:

姓名,性别,年龄,部门,薪水,入职日期
张三,男,28,IT部门,15800,2018-07-10
李四,女,28,IT部门,17400,2021-08-24
王五,男,28,IT部门,17800,2020-10-12
赵六,男,28,人事部门,8400,2019-11-21
李二,男,28,人事部门,6400,2018-03-02

示例代码

简单解析 CSV 文件

采用默认的 CSV 格式 CSVFormat.DEFAULT 解析 CSV 文件,代码如下:

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.io.Reader;
import java.net.URL;

/**
 * 使用默认格式解析 CSV 文件
 * @author hxstrive.com 2021/12/26
 */
public class CsvDemo1 {

    public static void main(String[] args) throws Exception {
        // 1.加载 csv 文件
        URL url = CsvDemo1.class.getResource("/demo.csv");
        Reader in = new FileReader(url.getFile());

        // 2.解析 csv 文件
        Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(in);

        // 3.逐一读取 csv 内容
        for (CSVRecord record : records) {
            // 按下标的方式读取内容
            System.out.printf("%s\t%s\t%s\t%s\t%s\t%s\n",
                record.get(0),
                record.get(1),
                record.get(2),
                record.get(3),
                record.get(4),
                record.get(5)
            );
        }
    }

}

自定义 CSV 头部

使用 CSVFormat.Builder 类的 setHeader() 方法为 CSV 设置头部字段,然后根据头部字段获取 CSV 内容。代码如下:

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;
import java.io.FileReader;
import java.io.Reader;
import java.net.URL;

/**
 * 使用默认格式解析 CSV 文件,且自定义头部映射
 * @author hxstrive.com 2021/12/26
 */
public class CsvDemo2 {

    public static void main(String[] args) throws Exception {
        URL url = CsvDemo2.class.getResource("/demo.csv");
        Reader in = new FileReader(url.getFile());

        Iterable<CSVRecord> records = CSVFormat.DEFAULT.builder()
                .setHeader("姓名", "性别", "年龄", "部门", "薪水", "入职日期")
                .build()
                .parse(in);
        for(CSVRecord record : records) {
            // 姓名,性别,年龄,部门,薪水,入职日期
            System.out.printf("%n\t\t%s\t%s\t%s\t%s\t%s\t%s",
                    record.getRecordNumber(),
                    record.get("姓名"),
                    record.get("性别"),
                    record.get("年龄"),
                    record.get("部门"),
                    record.get("薪水"),
                    record.get("入职日期")
            );
        }
    }

}

利用枚举自定义 CSV 枚举头部

使用 CSVFormat.Builder 类的 setHeader() 方法,通过枚举为 CSV 设置头部字段,然后根据头部字段获取 CSV 内容。代码如下:

(1)定义枚举类

/**
 * CSV文件头枚举
 * @author hxstrive.com 2021/12/26
 */
public enum HeaderEnum {
    NAME, SEX, AGE, DEPARTMENT, SALARY, HIREDATE
}

(2)示例代码

import com.hxstrive.csv.enums.HeaderEnum;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;
import java.io.Reader;
import java.net.URL;

/**
 * 使用默认格式解析 CSV 文件,采用枚举定义 CSV 头
 * @author hxstrive.com 2021/12/26
 */
public class CsvDemo3 {

    public static void main(String[] args) throws Exception {
        URL url = CsvDemo3.class.getResource("/demo.csv");
        Reader in = new FileReader(url.getFile());

        // 使用 withHeader() 方法映射 csv 头
        Iterable<CSVRecord> records = CSVFormat.DEFAULT.builder()
                .setHeader(HeaderEnum.class)
                .build()
                .parse(in);
        for (CSVRecord record : records) {
            // 姓名,性别,年龄,部门,薪水,入职日期
            System.out.printf("%s\t%s\t%s\t%s\t%s\t%s\n",
                    record.get(HeaderEnum.NAME),
                    record.get(HeaderEnum.SEX),
                    record.get(HeaderEnum.AGE),
                    record.get(HeaderEnum.DEPARTMENT),
                    record.get(HeaderEnum.SALARY),
                    record.get(HeaderEnum.HIREDATE)
            );
        }
    }

}
在年轻人的颈项上,没有什么东西能比事业心这颗灿烂的宝珠更迷人的了。 —— 哈菲兹
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号