Java实现Csv文件导入导出

news2024/11/17 1:35:09

Java实现Csv文件导入导出

什么是.csv文件?

CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 , 分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。

为什么使用CSV?

  1. 简单易懂:CSV 文件基于纯文本格式,因此可以使用任何文本编辑器(如Notepad++)轻松打开和编辑。
  2. 数据兼容性:CSV 文件中的数据可以很容易地跨平台进行传输和处理,任何具有 CSV 处理功能的软件(如Microsoft Excel、Google Sheets、甚至编程语言库)都能处理该类型的文件。
  3. 资源占用低:CSV 文件以纯文本形式存储数据,其体积相对较小,便于节省存储空间。

CSV文件的结构

  1. 每行表示一条记录:CSV 文件中的每一行代表一条记录,相当于数据库中的一行数据。第一行是字段名。
  2. 间隔符分隔:每行数据中,使用间隔符进行数据分隔,默认一般使用 , ,也可以使用空格等其他字符,代表不同的数据。经过测试,好像只有逗号分隔的csv文件才能在Excel中正常解析。
  3. 引号包围:当数据单元格中的内容含有逗号时,为避免混淆,需要引号 (单引号 ' 或双引号 ")将这个数据包围起来,防止误认为是两个不同数据。

例如:

姓名,年龄,性别
张三,25,男
李四,28,男
王五,22,

Java实现csv文件的读写操作

1. 导入依赖

    <dependency>
      <groupId>com.univocity</groupId>
      <artifactId>univocity-parsers</artifactId>
      <version>2.9.1</version>
    </dependency>

2. 导出。拿来主义,可以直接创建一个工具类使用,把导入导出方法粘贴进去使用即可。

    /**
     * csv文件导出
     *
     * @param data      导出数据
     * @param file      导出目的文件
     * @param separator 分割符
     * @param clazz     导出对象
     * @param <T>       数据对象泛型
     */
    public static <T> void export(Collection<T> data, File file, String separator, Class<T> clazz) {
        try {
            CsvWriterSettings settings = new CsvWriterSettings();
            //设置分隔符
            CsvFormat csvFormat = new CsvFormat();
            csvFormat.setDelimiter(separator);
            settings.setFormat(csvFormat);
            settings.setHeaderWritingEnabled(false);
            settings.setRowWriterProcessor(new BeanWriterProcessor<>(clazz));
            CsvWriter writer = new CsvWriter(Files.newOutputStream(file.toPath()), "utf-8", settings);
            // 写入header
            writer.writeHeaders(settings.getHeaders());
            data.forEach(writer::processRecord);
            writer.close();
        } catch (Exception e) {
            log.error("export .csv file failed. message.", e);
        }
    }

测试:

    @Getter
    @Setter
    @NoArgsConstructor
    @AllArgsConstructor
	@ToString
    public static class User implements Serializable {
        @Parsed
        private String name;
        @Parsed
        private Integer age;
    }

    public static void main(String[] args) {
        User user1 = new User("张三", 18);
        User user2 = new User("李四", 19);
        List<User> users = Arrays.asList(user1, user2);
        File file = new File("E:\\test.csv");
        CsvUtil.export(users, file, ",", User.class);
    }

结果:

Excel支持打开.csv文件:

image-20231026180302656

文本编辑器中打开:

image-20231026183411302

3. 导入

 	/**
	 * 读取crv文件并转换成List
	 *
	 * @param separator crv文件分隔符
	 * @param file      待读取文件
	 * @return crv对象list
	 */
	public static <T> List<T> read(String separator, File file, Class<T> clazz) {
		List<T> result = Collections.emptyList();
		try {
			BeanListProcessor<T> rowProcessor = new BeanListProcessor<>(clazz);
			//设置分隔符
			CsvFormat csvFormat = new CsvFormat();
			csvFormat.setDelimiter(separator);

			CsvParserSettings parserSettings = new CsvParserSettings();
			parserSettings.setProcessor(rowProcessor);
			parserSettings.setFormat(csvFormat);

			CsvParser parser = new CsvParser(parserSettings);
			InputStream in = Files.newInputStream(file.toPath());
			parser.parse(in);
			//逐行读取
			result = rowProcessor.getBeans();
		} catch (Exception e) {
            log.error("Import csv file failed. message: ", e);
		}
		return result;
	}

测试:

	@Getter
	@Setter
	@NoArgsConstructor
	@AllArgsConstructor
	@ToString
	public static class User implements Serializable {
		@Parsed
        private String name;
        @Parsed
        private Integer age;
    }

	public static void main(String[] args) {

		File file = new File("E:\\test.csv");
		List<User> users = CsvUtil.read(",", file, User.class);
		users.forEach(System.out::println);

	}

结果:

image-20231026181638900

总结:.csv文件导入导出比较简单,需要注意的地方有:

  • 涉及到导入导出映射的对象属性上需要加上@Parsed注解。
  • 分隔符如果是英文逗号分隔可以不用new CsvFormat()进行设置,默认使用的就是英文逗号作为分隔符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于蜣螂优化算法DBO优化的VMD-KELM光伏发电短期功率预测MATLAB代码

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; VMD适用于处理非线性和非平稳信号&#xff0c;例如振动信号、生物信号、地震信号、图像信号等。它在信号处理、振动分析、图像处理等领域有广泛的应用&#xff0c;特别是在提取信号中的隐含信息和去除噪声方面…

字符串中的strcpy和strncpy区别

strcpy:函数原型是char *strcpy(char* dest, const char *src)&#xff0c;含义是将src中的字符串复制到dest中。 strncpy:函数原型是char *strncpy(char *dest const char *src,int n&#xff09;&#xff0c;表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所…

香港施政报告人才引进政策2023全面解读,对优才计划申请是否有影响?

香港施政报告人才引进政策2023全面解读&#xff0c;对优才计划申请是否有影响&#xff1f; 香港第二份施政报告10月25日出来了&#xff01;这次真的是“走进民生”啊&#xff0c;什么路都帮你想好了&#xff01; 总结就是&#xff1a;继续抢人才、留人才&#xff01;在昨天的《…

103.linux5.15.198 编译 firefly-rk3399(2)

1. 平台&#xff1a; rk3399 firefly 2g16g 2. 内核&#xff1a;linux5.15.136 &#xff08;从内核镜像网站下载&#xff09; 3. 交叉编译工具 gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 4. 宿主机&#xff1a;ubuntu18.04 5. 需要的素材和资料&#xff…

MySQL 单表查询 多表设计

目录 数据库操作-DQL(单表查询)语法基本查询&#xff08;不带任何条件&#xff09;条件查询&#xff08;where&#xff09;聚合函数分组查询&#xff08;group by [having]&#xff09;&#xff08;重点&#xff09;排序查询&#xff08;order by&#xff09;&#xff08;重点&…

MySQL数据库基本操作2

文章目录 主要内容一.DQL1.语法格式代码如下&#xff08;示例&#xff09;: 2.数据准备代码如下&#xff08;示例&#xff09;: 3.简单查询代码如下&#xff08;示例&#xff09;: 4.运算符5.运算符操作-算术运算符代码如下&#xff08;示例&#xff09;: 6.运算符操作-条件查询…

Spring Cloud Sentinel整合Nacos实现配置持久化

sentinel配置相关配置后无法持久化&#xff0c;服务重启之后就没了&#xff0c;所以整合nacos&#xff0c;在nacos服务持久化&#xff0c;sentinel实时与nacos通信获取相关配置。 使用上一章节Feign消费者服务实现整合。 版本信息&#xff1a; nacos:1.4.1 Sentinel 控制台 …

【DRAM存储器十七】DDR2介绍-DDR2的新增技术-Post CAS、ODT、RDQS、OCD

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考资料&#xff1a;《镁光DDR数据手册》 目录 Post CAS ODT RDQS OCD Post CA…

方舟生存进化ARK个人服务器搭建教程保姆级

方舟生存进化ARK个人服务器搭建教程保姆级 大家好我是艾西&#xff0c;在很久之前我有给大家分享过方舟生存进化的搭建架设教程&#xff0c;但时间久远且以前的教程我现在回头看去在某些地方说的并不是那么清楚。最近也是闲暇无事打算重新巩固下方舟生存进化的搭建架设教程&…

[计算机提升] Windows文件系统类型介绍

1.13 文件系统 在Windows系统中&#xff0c;文件系统是一种用于组织和管理计算机上存储的文件和目录的方法。它提供了一种结构化的方式来访问、存储和检索数据。 以下是Windows系统中常见的文件系统&#xff1a; FAT&#xff08;FAT16、FAT32&#xff09;&#xff1a;FAT&…

2023年中国研磨液需求量、市场规模及行业竞争格局分析[图]

研磨是半导体加工过程中的一项重要工艺&#xff0c;它主要是应用化学研磨液混配磨料的方式对半导体表面进行精密加工&#xff0c;研磨液是平坦化工艺中研磨材料和化学添加剂的混合物&#xff0c;研磨材料主要是石英、二氧化铝和氧化铈&#xff0c;研磨液是影响半导体表面质量的…

endnote设置

问题1&#xff1a;参考文献的tab太长 首先要在endnote里面这样设置&#xff0c;file->output->edit "XXX" 保存之后&#xff0c;在word更新目录。 在word里面设置悬挂缩进 结果&#xff1a; Endnote参考编号与参考文献距离太远怎么调整 endnote 文献对齐方式…

LibTorch实战一:MNIST的python代码

目录 一、下载MNIST-demo的cpp、python版本代码 二、五分钟读懂pytorch代码 三、下载MNIST数据集、训练模型 四、模型序列化、可视化分析 本文借用mnist这个相对简易深度学习任务来开始讲解libtorch如何部署模型。因此&#xff0c;这是一个如何编写libtorch代码的实战教程。…

Linux权限大揭秘:深入理解系统安全

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 在之前的内容中&#xff0c;我们了解了Linux中的一些简单权限&#xff0c;如root超级账号与普通账户的区别、Linux文件权限管理、文件类型和访问权限以及许多关于修改权限的指令及其规则…

源发行版17 需要目标发行版 17问题解决

java: 警告: 源发行版 17 需要目标发行版 17 问题描述&#xff1a;解决办法&#xff1a;总结 问题描述&#xff1a; 解决办法&#xff1a; 1.将 Settings --> Build, Execution, Deployment --> Complier --> Java Complier 配置下的 Project bytecode version: 17 改…

为爱出发,与善同行丨纬创软件2023北京善行者圆满收官

2023年10月21日&#xff0c;北京善行者徒步活动在昌平正式开走。800支队伍3200名善行者队员进行32公里的公益行走。纬创软件组建「北京台协纬创软件队」&#xff0c;4名队员踏上32公里的征程&#xff0c;通过徒步筹款的方式传递善行理念&#xff0c;为贫困山区的孩子们建立“爱…

用AI打造一个属于自己的歌手,让她C位霸气出道

一、前言 今天玩儿点儿特别的&#xff0c;AI大行其道的今天&#xff0c;还没玩过AI模型的程序员绝对不是个好厨子。我本人比较喜欢音乐&#xff0c;但是一直没有出道&#xff0c;很是遗憾。那么今天&#xff0c;我就使用AI模型亲手打造一个堪比真人的歌手&#xff0c;让她C位霸…

2023年中国消防报警设备市场规模现状及行业竞争趋势分析[图]

消防安全行业主要分为消防产品和消防工程两个子行业。消防产品又可细分成消防装备、消防报警、自动灭火、防火与疏散、通用与防烟排烟、消防供水等 6 大类&#xff0c;其中消防装备主要用于消防部队&#xff0c;其他 5 大类主要用于建筑物消防。 消防行业内容 资料来源&#x…

《低代码指南》——如何通过维格表实现生产采购管理

信息 通过维格表的低代码开发能力,实现从销售订单转为生产计划工单并按需拆解为物料采购减少手工录入和计算工作,补充成熟ERP对MRP的个性化需求限制提升供应链运转效率生产采购过程中你有没有遇到这些问题?​ 从采购到生产,再到入库,流程太繁琐?生产力低下?采购系统员工…

商业级质感磨皮插件Portraiture5.0最新中文版本

整个摄影后期行业都在推崇Portraiture或DR5磨皮&#xff0c;这是一个被奉为——高级磨皮面板&#xff0c;修图神器、顶级修图的的扩展面板&#xff01;&#xff01;而最近7月份Portraiture更新到5.0版本了&#xff0c;还叫嚣“完虐”DR5高级磨皮&#xff01;&#xff01; 今coc…