Java使用Apache Commons高效处理CSV文件的操作指南

 更新时间:2025年03月07日 09:49:13   作者:拾荒的小海螺  
在 Java 开发中,CSV(Comma-Separated Values,逗号分隔值)是一种常见的数据存储格式,广泛用于数据交换和简单的存储任务,本文将介绍Java使用Apache Commons高效处理CSV文件的操作指南,需要的朋友可以参考下

1、简述

在 Java 开发中,CSV(Comma-Separated Values,逗号分隔值)是一种常见的数据存储格式,广泛用于数据交换和简单的存储任务。Apache Commons CSV 是 Apache 提供的一个轻量级库,专注于简化 CSV 文件的解析和生成,支持多种 CSV 格式,如 Excel、RFC 4180、MySQL 等。

本文将介绍 Commons CSV 的核心功能,并通过多个详细的使用示例展示其在 CSV 文件解析和生成中的强大功能。

2、为什么选择 Commons CSV?

  • 轻量级:无需庞大的依赖,功能集中。
  • 支持多种格式:兼容 Excel、RFC 4180、Tab 分隔等格式。
  • 简单易用:API 设计清晰,易于上手。
  • 灵活性高:支持自定义分隔符、自定义换行符等多种配置。

在使用 Commons CSV之前,需要添加其依赖。以下是 Commons CSV 的 Maven 依赖:

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

3、使用样例

Spring Boot 集成 Commons CSV 常见的使用样例,以下举例供参考:

3.1 写入 CSV 文件

Commons CSV 同样支持轻松生成 CSV 文件:

package com.lm.csv.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;

import java.io.FileWriter;
import java.io.IOException;

public class CsvWriterExample {
    public static void main(String[] args) throws IOException {
        // 创建 CSV 文件
        try (FileWriter writer = new FileWriter("e:\\csv\\output.csv");
             CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT
                     .withHeader("ID", "Name", "Age", "Email"))) {

            printer.printRecord("1", "Alice", "25", "alice@example.com");
            printer.printRecord("2", "Bob", "30", "bob@example.com");
            printer.printRecord("3", "Charlie", "35", "charlie@example.com");
        }
    }
}

3.2 使用自定义分隔符

如果需要自定义分隔符(例如分号 :),可以通过配置实现:

package com.lm.csv.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;

import java.io.FileWriter;

public class CustomDelimiterExample {
    public static void main(String[] args) throws Exception {
        try (FileWriter writer = new FileWriter("e:\\csv\\custom_delimiter.csv");
             CSVPrinter printer = new CSVPrinter(writer, CSVFormat.DEFAULT
                     .withHeader("ID", "Name", "Age", "Email")
                     .withDelimiter(':'))) {

            printer.printRecord("1", "Diana", "40", "diana@example.com");
            printer.printRecord("2", "Eve", "22", "eve@example.com");
        }
    }
}

3.3 解析嵌套引号或特殊字符

CSV 文件中可能包含嵌套引号或特殊字符(如换行符),Commons CSV 能轻松解析:

package com.lm.csv.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;

import java.io.StringReader;

public class SpecialCharacterExample {
    public static void main(String[] args) throws Exception {
        String csvData = "ID,Name,Notes\n" +
                "1,\"John\",\"Loves coding\nand teaching\"\n" +
                "2,\"Jane\",\"Enjoys reading\"";

        try (CSVParser parser = CSVFormat.DEFAULT
                .withFirstRecordAsHeader()
                .parse(new StringReader(csvData))) {

            parser.forEach(record -> {
                String id = record.get("ID");
                String name = record.get("Name");
                String notes = record.get("Notes");

                System.out.printf("ID: %s, Name: %s, Notes: %s%n", id, name, notes);
            });
        }
    }
}

3.4 使用枚举映射字段

对于字段定义明确的 CSV 文件,可以使用枚举来避免硬编码字段名称:

package com.lm.csv.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVRecord;

import java.io.FileReader;

public class EnumFieldExample {
    enum Header {
        ID, Name, Age, Email
    }

    public static void main(String[] args) throws Exception {
        try (FileReader reader = new FileReader("e:\\csv\\output.csv");
             CSVParser parser = CSVFormat.DEFAULT
                     .withFirstRecordAsHeader()
                     .parse(reader)) {

            for (CSVRecord record : parser) {
                String id = record.get(Header.ID);
                String name = record.get(Header.Name);
                String age = record.get(Header.Age);
                String email = record.get(Header.Email);

                System.out.printf("ID: %s, Name: %s, Age: %s, Email: %s%n", id, name, age, email);
            }
        }
    }
}

4、总结

Apache Commons CSV 是处理 CSV 文件的高效工具,无论是解析复杂的 CSV 数据还是生成自定义格式的 CSV 文件,都能提供简洁高效的解决方案。

优点:

  • 轻量级且易于使用。
  • 丰富的功能支持,如自定义分隔符、多格式支持。
  • 提供全面的 CSV 文件读取和写入功能。

适用场景:

  • 数据导入和导出。
  • 数据转换和清洗。
  • 作为应用程序中的轻量级数据库。
  • 通过本文的示例,希望你能够快速掌握 Commons CSV 的使用方法,并灵活应用于实际项目中!

以上就是Java使用Apache Commons高效处理CSV文件的操作指南的详细内容,更多关于Java Apache Commons处理CSV的资料请关注脚本之家其它相关文章!

相关文章

  • SpringCloud笔记(Hoxton)Netflix之Ribbon负载均衡示例代码

    SpringCloud笔记(Hoxton)Netflix之Ribbon负载均衡示例代码

    这篇文章主要介绍了SpringCloud笔记HoxtonNetflix之Ribbon负载均衡,Ribbon是管理HTTP和TCP服务客户端的负载均衡器,Ribbon具有一系列带有名称的客户端(Named Client),对SpringCloud Ribbon负载均衡相关知识感兴趣的朋友一起看看吧
    2022-06-06
  • Eclipse安装Aptana插件(注意对应版本问题)

    Eclipse安装Aptana插件(注意对应版本问题)

    这篇文章主要为大家详细介绍了Eclipse安装Aptana插件的相关资料,特别注意对应版本问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • springboot实现单文件和多文件上传

    springboot实现单文件和多文件上传

    这篇文章主要为大家详细介绍了springboot实现单文件和多文件上传,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • java随机生成10位数的字符串ID

    java随机生成10位数的字符串ID

    这篇文章主要为大家详细介绍了java随机生成10位数字符串ID的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java中的synchronized和ReentrantLock的区别详细解读

    Java中的synchronized和ReentrantLock的区别详细解读

    这篇文章主要介绍了Java中的synchronized和ReentrantLock的区别详细解读,synchronized是Java内建的同步机制,所以也有人称其为 IntrinsicLocking,它提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里,需要的朋友可以参考下
    2024-01-01
  • Java使用FTP上传文件并模拟接受的方法

    Java使用FTP上传文件并模拟接受的方法

    这篇文章主要介绍了Java使用FTP上传文件并模拟接受的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Java如何实现将类文件打包为jar包

    Java如何实现将类文件打包为jar包

    这篇文章主要介绍了Java如何实现将类文件打包为jar包,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • JVM原理之完整的一次GC流程解读

    JVM原理之完整的一次GC流程解读

    这篇文章主要介绍了JVM原理之完整的一次GC流程解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Java斗地主发牌课程设计

    Java斗地主发牌课程设计

    这篇文章主要为大家详细介绍了Java斗地主发牌课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 浅谈使用Maven插件构建Docker镜像的方法

    浅谈使用Maven插件构建Docker镜像的方法

    本篇文章主要介绍了浅谈使用Maven插件构建Docker镜像的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论