首页
学习
活动
专区
圈层
工具
发布

OpenCSV CSV到JavaBean

OpenCSV CSV到JavaBean转换详解

基础概念

OpenCSV是一个流行的Java库,用于处理CSV(逗号分隔值)文件。它提供了将CSV数据映射到Java对象(JavaBean)的功能,这种功能通常称为"数据绑定"或"对象映射"。

核心优势

  1. 简单易用:API设计简洁,几行代码即可完成CSV到对象的转换
  2. 高性能:处理大型CSV文件时效率较高
  3. 灵活性:支持自定义映射规则和转换器
  4. 注解支持:通过注解简化配置
  5. 错误处理:提供良好的异常处理机制

主要类型和方法

OpenCSV提供了两种主要方式将CSV映射到JavaBean:

  1. 基于注解的映射:使用@CsvBindByName等注解
  2. 基于列位置的映射:使用@CsvBindByPosition注解
  3. 编程式映射:使用HeaderColumnNameTranslateMappingStrategyColumnPositionMappingStrategy

应用场景

  • 导入/导出数据
  • 数据迁移
  • 报表生成
  • 批量数据处理
  • 与外部系统集成

示例代码

1. 定义JavaBean

代码语言:txt
复制
public class Employee {
    @CsvBindByName(column = "ID")
    private int id;
    
    @CsvBindByName(column = "Name")
    private String name;
    
    @CsvBindByName(column = "Age")
    private int age;
    
    @CsvBindByName(column = "Salary")
    private double salary;
    
    // 必须有无参构造函数
    public Employee() {}
    
    // getter和setter方法
    // ...
}

2. 读取CSV到JavaBean列表

代码语言:txt
复制
try (Reader reader = new FileReader("employees.csv")) {
    CsvToBean<Employee> csvToBean = new CsvToBeanBuilder<Employee>(reader)
        .withType(Employee.class)
        .withIgnoreLeadingWhiteSpace(true)
        .build();
    
    List<Employee> employees = csvToBean.parse();
    
    for (Employee emp : employees) {
        System.out.println(emp);
    }
} catch (IOException e) {
    e.printStackTrace();
}

3. 写入JavaBean到CSV

代码语言:txt
复制
List<Employee> employees = new ArrayList<>();
// 添加Employee对象到列表...

try (Writer writer = new FileWriter("output.csv")) {
    StatefulBeanToCsv<Employee> beanToCsv = new StatefulBeanToCsvBuilder<Employee>(writer)
        .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
        .build();
    
    beanToCsv.write(employees);
} catch (IOException | CsvRequiredFieldEmptyException | CsvDataTypeMismatchException e) {
    e.printStackTrace();
}

常见问题及解决方案

1. 字段映射失败

原因:列名不匹配或字段类型不兼容 解决

  • 检查注解中的列名是否与CSV文件中的列名完全一致
  • 确保JavaBean中的字段类型与CSV数据兼容
  • 使用自定义转换器处理特殊格式
代码语言:txt
复制
@CsvCustomBindByName(column = "Date", converter = LocalDateConverter.class)
private LocalDate hireDate;

2. 空值处理

原因:CSV中存在空值而JavaBean字段是基本类型 解决

  • 使用包装类(Integer, Double等)代替基本类型
  • 设置默认值
代码语言:txt
复制
@CsvBindByName(column = "Age", required = false)
private Integer age;  // 使用Integer而不是int

3. 性能问题

原因:处理大型CSV文件时内存不足 解决

  • 使用流式处理
  • 分批处理数据
代码语言:txt
复制
CsvToBean<Employee> csvToBean = new CsvToBeanBuilder<Employee>(reader)
    .withType(Employee.class)
    .withBatchSize(1000)  // 分批处理
    .build();

4. 特殊字符处理

原因:CSV中包含引号、逗号等特殊字符 解决

  • 配置适当的引号字符和转义字符
代码语言:txt
复制
StatefulBeanToCsv<Employee> beanToCsv = new StatefulBeanToCsvBuilder<Employee>(writer)
    .withQuotechar(CSVWriter.DEFAULT_QUOTE_CHARACTER)
    .withEscapechar(CSVWriter.DEFAULT_ESCAPE_CHARACTER)
    .build();

高级用法

自定义转换器

代码语言:txt
复制
public class LocalDateConverter extends AbstractBeanField<LocalDate> {
    @Override
    protected Object convert(String value) {
        return LocalDate.parse(value, DateTimeFormatter.ofPattern("yyyy/MM/dd"));
    }
}

处理不同分隔符

代码语言:txt
复制
CSVReader reader = new CSVReaderBuilder(new FileReader("data.tsv"))
    .withCSVParser(new CSVParserBuilder().withSeparator('\t').build())
    .build();

OpenCSV提供了强大而灵活的CSV处理能力,通过合理配置可以满足大多数CSV处理需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)

    3.项目实战 3.1环境准备 1.下载opencsv.jar 下载地址:http://www.java2s.com/Code/Jar/o/Downloadopencsv23jar.htm,下载zip,解压出来就可以看到...opencsv-2.3.jar。...如下图所示: 3.2代码设计 1.用opencsv方法去读取csv文件内容,如下图所示: 3.3参考代码 package lessons; import java.io.FileReader; import...java.io.IOException; import java.util.Iterator; import java.util.List; import au.com.bytecode.opencsv.CSVReader...} } 3.4运行代码 1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示: 4.小结 今天这个内容相对于前边的比较简单,时间不早了,今天宏哥就分享和讲解到这里

    92730

    PySpark 读写 CSV 文件到 DataFrame

    本文中,云朵君将和大家一起学习如何将 CSV 文件、多个 CSV 文件和本地文件夹中的所有文件读取到 PySpark DataFrame 中,使用多个选项来更改默认行为并使用不同的保存选项将 CSV 文件写回...PySpark 在 DataFrameReader 上提供了csv("path")将 CSV 文件读入 PySpark DataFrame 并保存或写入 CSV 文件的功能dataframeObj.write.csv...1.2 读取多个 CSV 文件 使用read.csv()方法还可以读取多个 csv 文件,只需通过逗号分隔作为路径传递所有文件名,例如: df = spark.read.csv("path1,path2...,path3") 1.3 读取目录中的所有 CSV 文件 只需将目录作为csv()方法的路径传递给该方法,我们就可以将目录中的所有 CSV 文件读取到 DataFrame 中。...df = spark.read.csv("Folder path") 2. 读取 CSV 文件时的选项 PySpark 提供了多种处理 CSV 数据集文件的选项。

    2.3K20

    通过OpenCVS实现对CSV数据的封装

    需求: 一般CSV文件都作为系统基础数据提供者的角色被频繁使用者。如果在进行自动化测试时,测试用例中的数据非常依赖于SUT中的上下文基础数据,而这些基础数据又是通过CSV文件导入到SUT之中。...那么,考虑将这些CSV文件中遴选出部分必须的,导入到测试框架中,作为测试框架的基础数据存在并供下游用例使用。...思路: 与通过xstream 将 xml文件转换成java 对象类似,利用工具将csv文件也转换为java 对象。能实现此类功能的第三方工具包比较多,这里采用的是opencsv。...它的官方网站是:http://opencsv.sourceforge.net。 实现: 1....au.com.bytecode.opencsv.CSVReader; import au.com.bytecode.opencsv.bean.CsvToBean; import au.com.bytecode.opencsv.bean.HeaderColumnNameMappingStrategy

    1.1K20

    测试工具中的设计模式实例谈之三迭代器模式(Iterator)

    迭代器模式简介 Opencsv提供了非常方便的CSV文件解析方法。在此基础上加以简单的封装,就可以实现一个较为通用的CSV文件转换为Java对象的方法。...OPENCSV简介 从面向对象的角度,如果将一个CSV文件的记录结构类比成一个JAVA类,那么该CSV文件中的每一条记录,就可以理解为同一个类的不同实例。...OpenCSV就是一个在CSV数据文件和java 对象集合之间互相转换的第三方工具包。对OpenCSV感兴趣的读者可以访问其官方网站http://opencsv.sourceforge.net。...在OpenCSV中也使用了迭代器模式进行数据集的遍历。 3. CSVIterator迭代器 在OpenCsv中,需要在解析CSV数据文件的过程中,完成对于数据文件中的内容进行逐行的遍历。...因此,OpenCsv提供了 CSVIterator这个迭代器, ?

    72420

    Logstash: 应用实践 - 装载 CSV 文档到 Elasticsearch

    为防止数据丢失,您可以使 Logstash 通过使用持久队列将正在进行的事件持久化到磁盘上。...我们可以到网址 kaggle.com 进行下载。该网站含有大量的数据可以供我们进行下载。....└── cars.csv 0 directories, 1 filelocalhost:data liuxg$ pwd/Users/liuxg/data 我们可以看到在data目录下只有叫做cars.csv...Index CSV 文件到 Elasticsearch 在上一节中,我们已经把我们的数据存入到我们的data目录中。在这节里我们来讲述如何把数据写入到 Elasticsearch 之中。...我们也同时使用 stdout,这样我们可以在terminal屏幕中看出数据在处理之中 装载数据到 Elasticsearch 我们首先进入到 Logstash 的安装目录,然后打入如下的命令: sudo

    1.2K10

    5月20日送给单身狗的礼物-《自己写轮子之CSV轮子》

    二、Opencsv 官方地址: http://opencsv.sourceforge.net/#quick_start 简介: JAVA中易于使用的CSV解析依赖库,设计出来的目的是因为当时CSV解析器没有商业友好的许可证...、简单的读取和写入CSV的接口,作者希望通过common-csv替换掉之前与csv相关的一些框架如opencsv、skife csv等。...---- 经过对常用的CSV操作框架对比,考虑到性能、后续拓展性、以及官方文档完整性等方面因素,最终决定使用:Univocity-parser来处理CSV文件。...中数据绑定到实体属性中,然后存储带list集合上 RowListProcessor rowListProcessor = new RowListProcessor();...// 执行数据持久化 persistentStringDataToDb(rowDataList, rowAction); } /** * 将数据持久化到数据库中

    1.2K00

    Matlab保存数据到csv文件的方法分享

    一个同学咨询了一个问题,如何把matlab变量区的数据保存到csv文件里面,故此分享一下Matlab保存数据到csv文件的方法。...csv其实也是一个txt,只不过csv是带特定格式的txt而已,举个例子,编辑一个txt文件,内容如下 把这个文件名后缀修改为csv,新建 文本文档.csv,则用excel打开 所以在matlab中保存为...'); 但注意一下,writetable也会按照变量名称生成一个表头,这个暂未找到如何取消,懂得朋友可以私信我一下方法 2、fopen csv格式是用逗号分隔数据的一种文件。...用MATLAB将数据写入csv文件时,首先用fopen创建一个有写入权限的文件,然后用fprintf函数将数据逐一写入。不换行的数据用逗号分隔,换行时用\n。...fid = fopen('test.csv', 'w+', 'n', 'utf8'); % 创建一个csv文件 for i=1:3 fprintf(fid, '%d,%d,%d\n', A

    6.6K20

    JAVA读取csv文件_java读取csv文件某一列

    csv文件的介绍 以下是来自百度百科的介绍 逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本...csv文件的读取方式 1、java原生方式 当读取的是一个简单的csv文件,即文件的列字段中不包含分隔符时,可以使用BufferedReader或者Scanner类去读取 BufferedReader方式...// 创建 reader try (BufferedReader br = Files.newBufferedReader(Paths.get("users.csv"))) { // CSV文件的分隔符...jovan@example.com FR 4 Greg Hover greg@example.com US 2、第三方库 第三方库提供更加丰富且成熟的功能,可以更加方便的读和写,版本号可以使用最新版 OpenCSV...pom中引入以下jar com.opencsv opencsv

    4.5K30

    Python 读取txt、csv、mat数据并载入到数组

    一、txt文件数据载入到数组 这里结合上一篇博文的数据来讲怎么方便的载入.txt文件到一个数组,数据如下所示: 1、自己写Python代码实现txt文本数据读取并载入成数组形式(PS:下面给了三种方法...文件数据载入到数组 在一些数据竞赛里面碰到很多的数据都是.csv文件给出的,说明应用应该还是有一些广泛。...首先这里csv文件编码格式必须为UTF-8,否则会报编码错误信息。(txt转csv文件流程:打开excel—>数据—>导入文本/csv—>编码格式选择UTF-8—>保存选择csv格式)。...csv文件打开如下所示: 首先python内置了csv库,可以调用然后自己手动来写操作的代码,比较简单的csv文件读取载入到数组可以采用python的pandas库中的read_csv()函数来读取...scipy.io.loadmat(file_name, mdict=None, appendmat=True, **kwargs) #载入MATLAB文件 #保存一个带有名称和序列的字典到.mat文件中

    5.1K40
    领券
    首页
    学习
    活动
    专区
    圈层
    工具
    MCP广场