Java如何读取CSV文件并将数据放入对象中详解

article/2025/6/28 19:33:35

Java如何读取CSV文件并将数据放入对象中详解

CSV(Comma-Separated Values)文件是一种常见的数据存储格式,广泛应用于数据交换、日志记录和表格数据处理。在Java开发中,读取CSV文件并将数据映射到对象中是常见的需求。本文将详细介绍几种常见方法,包括手动解析、使用标准库(BufferedReader)、第三方库(如OpenCSV),以及通过反射实现动态映射,并结合代码示例和流程图说明。


在这里插入图片描述

一、CSV文件的基本结构

CSV文件由多行文本组成,每行代表一条记录,字段之间用逗号(,)分隔。例如:

姓名,年龄,城市
张三,25,北京
李四,30,上海
王五,22,广州
  • 第一行:表头(字段名)。
  • 后续行:数据行,字段值与表头一一对应。

二、手动解析CSV文件(使用BufferedReader

1. 核心思路

通过BufferedReader逐行读取文件,使用split()方法分割字段,并手动将数据映射到对象中。

2. 代码示例

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;public class CsvReader {public static void main(String[] args) {String csvFile = "data.csv";String line;String csvSplitBy = ",";try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {// 读取表头if ((line = br.readLine()) != null) {String[] headers = line.split(csvSplitBy);System.out.println("表头: " + String.join(", ", headers));}// 读取数据行while ((line = br.readLine()) != null) {String[] data = line.split(csvSplitBy);Person person = new Person(data[0], Integer.parseInt(data[1]), data[2]);System.out.println(person);}} catch (IOException e) {e.printStackTrace();}}
}class Person {private String name;private int age;private String city;public Person(String name, int age, String city) {this.name = name;this.age = age;this.city = city;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + ", city='" + city + "'}";}
}

3. 流程图说明

[读取CSV文件] → [逐行读取] → [分割字段] → [映射到对象] → [输出结果]

4. 优点与局限

  • 优点:代码简单,无需依赖第三方库。
  • 局限
    • 无法处理字段中的特殊字符(如逗号、换行符)。
    • 需要手动处理类型转换(如Stringint)。
    • 不适合复杂场景(如嵌套对象、动态字段)。

三、使用Java标准库(FilesStream

1. 核心思路

利用Java 8+的Files.lines()Stream API简化读取过程,结合split()方法分割字段。

2. 代码示例

import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Stream;public class StreamCsvReader {public static void main(String[] args) {String csvFile = "data.csv";String csvSplitBy = ",";try (Stream<String> stream = Files.lines(Paths.get(csvFile))) {stream.skip(1) // 跳过表头.forEach(line -> {String[] data = line.split(csvSplitBy);Person person = new Person(data[0], Integer.parseInt(data[1]), data[2]);System.out.println(person);});} catch (Exception e) {e.printStackTrace();}}
}

3. 流程图说明

[读取CSV文件] → [跳过表头] → [逐行处理] → [映射到对象] → [输出结果]

4. 优点与局限

  • 优点:代码简洁,适合中小型文件。
  • 局限:同样无法处理字段中的特殊字符。

四、使用第三方库(OpenCSV)

1. 核心思路

OpenCSV是一个专门处理CSV文件的库,支持自动映射到Java对象(POJO),并处理复杂场景(如字段中的逗号、引号)。

2. 添加依赖

Maven配置:

<dependency><groupId>com.opencsv</groupId><artifactId>opencsv</artifactId><version>5.5.2</version>
</dependency>

3. 代码示例

(1)定义POJO类
import com.opencsv.bean.CsvBindByName;public class Person {@CsvBindByName(column = "姓名")private String name;@CsvBindByName(column = "年龄")private int age;@CsvBindByName(column = "城市")private String city;// Getters and Setters@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + ", city='" + city + "'}";}
}
(2)读取CSV文件
import com.opencsv.bean.CsvToBean;
import com.opencsv.bean.CsvToBeanBuilder;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;public class OpenCsvReader {public static void main(String[] args) {String csvFile = "data.csv";try (FileReader reader = new FileReader(csvFile)) {CsvToBean<Person> csvToBean = new CsvToBeanBuilder<Person>(reader).withType(Person.class).withIgnoreLeadingWhiteSpace(true).build();List<Person> persons = csvToBean.parse();persons.forEach(System.out::println);} catch (IOException e) {e.printStackTrace();}}
}

4. 流程图说明

[读取CSV文件] → [使用OpenCSV解析] → [自动映射到对象] → [输出结果]

5. 优点与局限

  • 优点
    • 自动处理特殊字符(如逗号、引号)。
    • 支持注解映射,代码简洁。
    • 提供类型安全和错误处理。
  • 局限:需要引入第三方库。

五、通过反射动态映射(高级方法)

1. 核心思路

利用Java反射机制动态获取字段名和值,适用于不确定字段结构的场景(如动态表单数据)。

2. 代码示例

import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;public class ReflectionCsvReader {public static <T> List<T> readCsv(String csvFile, Class<T> clazz) {List<T> result = new ArrayList<>();String line;String csvSplitBy = ",";try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {// 读取表头if ((line = br.readLine()) != null) {String[] headers = line.split(csvSplitBy);// 读取数据行while ((line = br.readLine()) != null) {String[] data = line.split(csvSplitBy);T obj = clazz.getDeclaredConstructor().newInstance();Field[] fields = clazz.getDeclaredFields();for (int i = 0; i < fields.length; i++) {Field field = fields[i];field.setAccessible(true);field.set(obj, data[i]);}result.add(obj);}}} catch (Exception e) {e.printStackTrace();}return result;}public static void main(String[] args) {List<Person> persons = readCsv("data.csv", Person.class);persons.forEach(System.out::println);}
}

3. 流程图说明

[读取CSV文件] → [动态获取字段] → [反射设置值] → [输出对象]

4. 优点与局限

  • 优点:适用于动态字段场景,无需硬编码。
  • 局限
    • 类型安全性差(如字段类型不匹配可能导致运行时错误)。
    • 性能较低(反射操作较慢)。

六、处理特殊字符和编码问题

1. 字段中的特殊字符

如果字段值包含逗号(如"北京,中国"),需用双引号包裹字段,并手动解析:

姓名,年龄,城市
张三,25,"北京,中国"

2. 编码问题

确保文件编码与读取方式一致(如UTF-8):

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), StandardCharsets.UTF_8)
);

七、最佳实践总结

方法适用场景优点缺点
手动解析简单场景无需依赖库无法处理复杂数据
BufferedReader中小型文件代码简单需手动处理类型转换
OpenCSV复杂场景自动映射、处理特殊字符需引入第三方库
反射动态映射动态字段灵活性能低、类型安全差

八、总结

读取CSV文件并将数据映射到对象中是Java开发中的常见需求。根据项目需求选择合适的方法:

  • 简单场景:使用BufferedReaderStream API。
  • 复杂场景:优先使用OpenCSV等第三方库。
  • 动态字段:结合反射实现动态映射。

通过合理处理特殊字符和编码问题,开发者可以高效完成CSV数据的解析与对象化,为后续的数据处理和分析提供坚实基础。


http://www.hkcw.cn/article/GTMNFAnalJ.shtml

相关文章

LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 CC 的 RedTeam 框架

一、软件介绍 文末提供程序和源码下载 LazyOwn RedTeam/APT 框架是第一个具有人工智能驱动的 C&C 的 RedTeam 框架&#xff0c;具有隐藏活动的 rootkit、与 Windows/Linux/Mac OSX 兼容的不可检测的可塑植入物&#xff0c;以及自配置后门。凭借其 Web 界面和强大的…

Java学习——day2(Servlet 基础编程)

文章目录 1. 什么是 Servlet&#xff1f;2. Servlet 的生命周期2.1 init()2.2 service()2.3 destroy() 3. 创建 Servlet 类4. Servlet 配置方式4.1 创建步骤4.2 重新构建并启动项目4.3 启动Tomcat 5. 总结 1. 什么是 Servlet&#xff1f; Servlet 是 Java Web 中用于处理客户端…

Aop + 注解实现数据字典类型转换 EasyExcel导出

Aop 注解 实现数据字典类型转换 文章目录 Aop 注解 实现数据字典类型转换一、基础方式✅字典转换简介&#x1f449;实现步骤✅ 1. 定义自定义注解Dict ✅ 2. 定义查询字典项的两个方法✅ 3. 定义Aop拦截我们查询的方法✅ 4. VO映射类✅ 5. Controller层✅ 6. serviceImpl✅ 7. …

力扣热题100之对称二叉树

题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 代码 方法一&#xff1a;递归 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left …

链式前向星图解

e[idx] b; 边之终点 ne[idx] h[a]; 谓之头插之边 h[a] idx ; 谓之指针更新 注意&#xff1a;上述以a为开头的一条链上的结点&#xff0c;在物理上都是a的邻接点&#xff0c;相邻的边用idx来标明序号&#xff0c;相邻的边之间有映射。 链式前向星的遍历 假设顶点 u 的邻接表…

MybatisPlus(含自定义SQL、@RequiredArgsConstructor、静态工具类Db)

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

R语言基础| 创建数据集

在R语言中&#xff0c;有多种数据类型&#xff0c;用以存储和处理数据。每种数据类型都有其特定的用途和操作函数&#xff0c;使得R语言在处理各种数据分析任务时非常灵活和强大&#xff1a; 向量&#xff08;Vector&#xff09;: 向量是R语言中最基本的数据类型&#xff0c;它…

UE特效Niagara性能分析

开启Niagara调试器 开启显示概览 界面显示 &#x1f7e9; 上方绿色面板&#xff1a;Niagara DebugHud 这是 HUD&#xff08;调试视图&#xff09; 模式下的性能统计显示&#xff0c;内容如下&#xff1a; 项目含义SystemFilter: ShockWave_01当前选中的 Niagara 粒子系统名称…

MySQL——事务

目录 问题 什么是事务 为什么会有事务 事务版本支持 事务提交方式 事务常见操作 事务隔离级别 查看与设置隔离性 事务四种隔离级别 读未提交 读提交 不可重复读 串行化 一致性 理解隔离性 4个隐藏字段 undo日志 MVCC Read View RR 与 RC 本质区别 问题…

Vue-3-前端框架Vue基础入门之VSCode开发环境配置和Tomcat部署Vue项目

文章目录 1 安装配置VSCode1.1 安装中文语言插件1.2 主题颜色1.3 禁用自动更新1.4 开启代码提示设置1.5 安装open in browser插件2 安装配置nodejs2.1 配置环境变量2.2 npm与maven的区别2.3 使用npm避坑3 创建Vue项目3.1 两种创建方式3.2 package.json3.3 安装新的依赖3.4 运行…

Webpack依赖

Webpack到底怎么对我们的项目进行打包捏&#xff1f; 在webpack处理应用程序时&#xff0c;会根据命令或者配置文件找到入口文件 从入口开始&#xff0c;会生成一个依赖关系图&#xff0c;这个依赖关系图会包含应用程序中所需的所有模块&#xff08;.js、css文件、图片、字体…

关于找不到符号,符号变量log的问题的解决方案

创建时间&#xff1a;06月02日 1、问题描述 最近在学习鱼皮的AI超级智能体项目过程中&#xff0c;遇到如下错误&#xff1a; java: 找不到符号符号: 变量 log位置: 类 com.liucc.aiagent.app.LoveApp2、排查思路 网上的常见解决思路主要是检查lombok插件是否安装、Enable…

mysql离线安装教程

1.下载地址: https://downloads.mysql.com/archives/community/ 2.上传安装包到系统目录,并解压 tar -xvf mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar3.检查系统中是否存在mariadb的rpm包 rpm -qa|grep mariadb存在则删除 rpm -e xxx4.解压完后执行如下命令安装 sudo rpm -iv…

【git-首次初始化本地项目、关联远程仓库】

使用场景&#xff1a; windows系统本地首次创建的项目本地已存在但未关联为git项目 操作步骤 创建远程仓库 在gitee或github创建新仓库即可本地安装git 搜索“git安装教程”&#xff0c;按照步骤安装即可打开git中端&#xff0c;进入项目文件夹 cd E:\xxx备注&#xff1a;这…

AI驱动的文本转Mermaid图表工具Smart Mermaid

简介 什么是 Smart Mermaid &#xff1f; Smart Mermaid 是一款基于 AI 技术的 Web 应用程序&#xff0c;能够将文本内容智能转换为 Mermaid 格式的代码&#xff0c;并将其渲染成可视化图表。用户只需输入文本描述&#xff0c;AI 即可生成相应的图表&#xff0c;支持多种图表类…

调用蓝耘API打造AI 智能客服系统实践教程

声明&#xff1a;文章是实验教程&#xff0c;不是广告 1.前言 在用户与人工客服的沟通中&#xff0c;等待时间长、需求难满足等问题频发&#xff0c;企业面临用户流失风险&#xff0c;用户渴望快速精准的答案&#xff0c;企业需要“开源节流”、“降本增效”。对此&#xff0c…

VM图像处理之图像二值化

什么是灰度&#xff1f; 灰度&#xff08;Grayscale&#xff09;是指将彩色图像转换为仅包含亮度信息&#xff08;黑白过渡&#xff09;的单通道图像的过程或结果。灰度图像中每个像素的数值代表该点的明暗程度&#xff0c;而不包含颜色信息。 亮度代替颜色&#xff1a; 灰度…

通信革新与网络安全探索与创新:开启未来之门

在科技飞速发展的当下&#xff0c;各领域的前沿探索正不断刷新着人类的认知与能力边界。脑机接口领域取得重大突破&#xff0c;上海阶梯医疗科技有限公司成功完成国内首例侵入式脑机接口系统前瞻性临床试验&#xff0c;受试者通过植入大脑的设备实现用意念玩游戏&#xff0c;为…

sigmastar实现SD卡升级

参考文章:http://wx.comake.online/doc/DD22dk2f3zx-SSD21X-SSD22X/customer/development/software/Px/zh/sys/P3/usb%20&%20sd%20update.html#21-sd 1、构建SD卡升级包 在project下make image完成后使用make_sd_upgrade_sigmastar.sh脚本打包SD卡升级包。 ./make_sd_up…

hook组件-useEffect、useRef

hook组件-useEffect、useRef useEffect 用法及执行机制 WillMount -> render -> DidMount ShouldUpdate -> WillUpdate -> render -> DidUpdate WillUnmount(只有这个安全) WillReceiveProps useEffect(callback) 默认所有依赖都更新useEffect(callback, [])&am…