Java处理CSV类库:OpenCSV

一:CSV简介

Comma-Separated Values(CSV), 因分隔符没有严格指定规范标准,可以使用逗号,也可以使用其他字符(如制表符\t、分号;等),所以CSV也称为 逗号分隔值或者字符分隔值。csv文件是使用纯文本来存储表格数据(即只能存储文本,不能存储二进制数据)。CSV因没有严格的规范,所以变异的形式比较多。

二:CSV文件的组成和规则

组成:

  • csv文件由任意条数据的【记录】组成, 每条记录的最后一个字段也要使用分隔符,记录间一般使用换行符分隔\n,也可以指定其他字符串(比如”——”)
  • 每条记录由【字段】组成,字段间使用分隔符(逗号、制表符\t等)分隔。

规则:

  1. 开头是不留空,以行为单位。
  2. 可含或不含列名,含列名则居文件第一行。
  3. 一行数据不跨行,无空行。
  4. 以半角逗号(即,)作分隔符,列为空也要表达其存在。
  5. 列内容如存在半角引号(即”),替换成半角双引号(”“)转义,即用半角引号(即”“)将该字段值包含起来。
  6. 文件读写时引号,逗号操作规则互逆。
  7. 内码格式不限,可为 ASCII、Unicode 或者其他。
  8. 不支持特殊字符
  9. 如果值有特殊字符(逗号,双引号,换行符等)要使用引号(一般使用双引号,也可以指定单引号)括起来,比如分隔符是逗号,值中也出现逗号了
  10. 值中出现双引号,需要使用双引号来转义
"ID,Name,Age,Birthday,\n1,zhangsan,20,1990-08-08,\n2,lisi,21,1990-08-09,\n"

三、CSV和Excel的区别

csv文件可以被excel软件打开,csv只能用于存储纯文本内容,excel不仅支持纯文本内容还支持二进制数据,可以看做csv是excel的轻量级简单版的实现,excel比csv更加强大,csv文件一般用于表格数据的传输。

四、类库简介opencsv

官网: http://opencsv.sourceforge.net/
maven:https://mvnrepository.com/artifact/com.opencsv/opencsv 目前最新版本4.0,更新比较频繁,4.0版本还不够成熟。
支持注解(根据名称或者位置)
支持自定义转换器AbstractBeanField
支持跳跃行skipLine和数据过滤Filter

注解:

  • @CsvBindByName:根据CSV输入中该字段的标题名,将一个bean字段映射到CSV文件中的一个字段, 可以控制列名,按名字列名的先后顺序好像是按照字母排序的
  • @CsvBindByPosition:根据CSV输入中字段的数字位置,将一个bean字段映射到CSV文件中的一个字段@CsvBindByPosition(position = 0) 按位置好像不能写列名,但是可以控制列的顺序, 还不知道即可控制列名,又可以控制列的顺序的方法(通过String[]控制应该是最灵活的)
  • @CsvCustomBindByName:与CsvBindByName相同,但必须提供自己的数据转换类。
  • @CsvCustomBindByPosition:与CsvBindByPosition相同,但必须提供自己的数据转换类。
  • @CsvDate:必须应用于日期/时间类型的bean字段,以便自动转换工作,并且必须与前述四个注释中的一个一起使用。

API

CSVWriterpublic CSVWriter(Writer writer, char separator, char quotechar, char escapechar, String lineEnd);public void writeAll(List<String[]> allLines);public void writeNext(String[] nextLine);protected void writeColumnNames(ResultSet rs);public void flush();public void close();CSVReaderpublic CSVReader(Reader reader, char separator, char quotechar, char escape, int line, boolean strictQuotes, boolean ignoreLeadingWhiteSpace);public String[] readNext();public List<String[]> readAll();public void close();
StrategyColumnPositionMappingStrategyHeaderColumnNameMappingStrategyHeaderColumnNameTranslateMappingStrategy

自定义的符号:

  • char separator: 分隔符, 默认使用逗号
  • char quotechar: 引号字符,双引号或者单引号,默认双引号,每个值都使用指定的引号包围起来,即使数据类型是int类型也会用引号引起来
  • char escapechar:转义字符, 默认是双引号
  • String lineEnd:行结束符,默认\n 或者 \r\n

五、基本使用

方式一:使用String[]方式

// CSVWriter 写
@Test
public void testWriteByStringArray() throws Exception{OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("D:\\test.csv"), Charset.forName("UTF-8"));CSVWriter csvWriter = new CSVWriter(out, ',');String[] record0 = {"id", "name", "age", "birthday"};csvWriter.writeNext(record0);String[] record1 = {"1", "张三", "20", "1990-08-08"};String[] record2 = {"2", "lisi", "21", "1991-08-08"};String[] record3 = {"3", "wangwu", "22", "1992-08-08"};List<String[]> allLines = new ArrayList<String[]>();allLines.add(record1);allLines.add(record2);allLines.add(record3);csvWriter.writeAll(allLines);csvWriter.close();
}

在这里插入图片描述

// CSVReader 读
@Test
public void testRead() throws Exception{InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\test.csv"), Charset.forName("UTF-8"));CSVReader reader = new CSVReader(in, ',');List<String[]> allRecords = reader.readAll();for (String[] records : allRecords) {for (String filed : records) {System.out.print(filed + " ");}System.out.println();}reader.close();
}

在这里插入图片描述

方式二:使用注解Bean方式

package com.mengday.csv;import com.opencsv.bean.*;import com.opencsv.bean.customconverter.ConvertSplitOnWhitespace;import java.util.Date;
import java.util.List;public class User {@CsvBindByName(required = true)private Long id;@CsvBindByName(column = "User Name")private String name;private int age;@CsvBindByName@CsvDate("yyyy-MM-dd hh:mm:ss")private Date birthday;@CsvCustomBindByName(converter = ConvertSplitOnWhitespace.class)private List<String> tags;@CsvBindByNameprivate boolean vip;public User(){}public User(Long id, String name, int age, Date birthday, List<String> tags, boolean vip) {this.id = id;this.name = name;this.age = age;this.birthday = birthday;this.tags = tags;this.vip = vip;}// Getter && Setter && toString()
}
@Testpublic void testCSVWriteByAnnotation() throws Exception{List<User> users = new ArrayList<User>();users.add(new User(1L, "张'三'", 20, new Date(), Arrays.asList("eat", "drink", "girl"), true));users.add(new User(2L, "李,四", 21, new Date(), Arrays.asList("mm", "money"), false));users.add(new User(3L, "王\n五", 22, new Date(), Arrays.asList("girl", "$"), true));OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("D:\\test.csv"), Charset.forName("UTF-8"));StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).withSeparator('\t').withQuotechar('\'').build();beanToCsv.write(users);writer.close();}

在这里插入图片描述

@Test
public void testCSVReadByAnnotation() throws Exception{InputStreamReader in = new InputStreamReader(new FileInputStream("D:\\test.csv"), Charset.forName("UTF-8"));HeaderColumnNameMappingStrategy strategy = new HeaderColumnNameMappingStrategy();strategy.setType(User.class);CsvToBean csvToBean = new CsvToBeanBuilder<User>(in).withSeparator('\t').withQuoteChar('\'').withMappingStrategy(strategy).build();List<User> users = csvToBean.parse();for(User user: users) {System.out.println(user);}
}

在这里插入图片描述

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

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

相关文章

MSSQL 命令行操作说明 sql server 2022 命令行下进行配置管理

说明&#xff1a;本文的内容是因为我在导入Access2019的 *.accdb 格式的数据时&#xff0c;总是出错的背景下&#xff0c;不得已搜索和整理了一下&#xff0c;如何用命令行进行sql server 数据库和用户管理的方法&#xff0c;作为从Access2019 直接导出数据到sql server 数据库…

linux限权

shell命令以及运行原理 什么是shell命令&#xff1a; 将使用者的命令翻译给核心&#xff08;kernel&#xff09;处理。同时&#xff0c;将核心的处理结果翻译给使用者。 shell就相当于操作系统外的一层外壳 其实就是登录linux时的一个可执行程序&#xff08;进程&#xff09…

安装kali虚拟机

第一步&#xff1a;安装vmware 安装到最后&#xff0c;会提示输入序列号 安装成功后的图标 第二步&#xff1a;创建一个虚拟主机 创建了一个虚拟机 第三步&#xff1a;给虚拟机安装系统 安装系统&#xff0c;都必须有 系统镜像文件 一般系统镜像文件的后缀是 .iso 第一步&a…

利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码,TensorFlow框架,)

效果视频&#xff1a;利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码&#xff0c;TensorFlow框架&#xff0c;压缩包带有数据集和代码&#xff0c;解压缩可直接运行)_哔哩哔哩_bilibili 售后包免费远程协助运行&#xff08;用向日葵或者todesk软件协助&#xff09; …

GoogleNet网络训练集和测试集搭建

测试集和训练集都是在之前搭建好的基础上进行修改的&#xff0c;重点记录与之前不同的代码。 还是使用的花分类的数据集进行训练和测试的。 一、训练集 1、搭建网络 设置参数&#xff1a;使用辅助分类器&#xff0c;采用权重初始化 net GoogleNet(num_classes5, aux_logi…

Midjourney常见玩法及prompt关键词技巧

今天系统给大家讲讲Midjourney的常见玩法和prompt关键词的一些注意事项&#xff0c;带大家入门&#xff5e;&#xff08;多图预警&#xff0c;建议收藏&#xff5e;&#xff09; 一、入门及常见玩法 1、注册并添加服务器&#xff08;会的童鞋可跳过&#xff5e;&#xff09; …

实在智能携AI Agent智能体亮相2024年度QCon全球软件开发大会

4月11日-13日&#xff0c;以“全面进化”作为2024年度主题的「QCon全球软件开发大会暨智能软件开发生态展」在北京隆重举行。作为AI准独角兽和超自动化头部企业&#xff0c;实在智能应邀出席发表《面向办公自动化领域的AI Agent建设思考与分享》演讲及圆桌交流&#xff0c;展示…

反转二叉树(力扣226)

解题思路&#xff1a;用队列进行前序遍历的同时把节点的左节点和右节点交换 具体代码如下&#xff1a; class Solution { public:TreeNode* invertTree(TreeNode* root) {if (root NULL) return root;swap(root->left, root->right); // 中invertTree(root->left)…

OpenHarmony南向开发案例【智慧中控面板(基于 Bearpi-Micro)】

1 开发环境搭建 【从0开始搭建开发环境】【快速搭建开发环境】 参考鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或复制转到。 【注意】&#xff1a;快速上手教程第六步出拉取代码时需要修改代码仓库地址 在MobaXterm中输入…

【模拟】Leetcode 提莫攻击

题目讲解 495. 提莫攻击 算法讲解 前后的两个数字之间的关系要么是相减之差 > 中毒时间 &#xff0c;要么反之 那即可通过示例&#xff0c;进行算法的模拟&#xff0c;得出上图的计算公式 class Solution { public:int findPoisonedDuration(vector<int>& time…

至少需要[XXXXMB]内存才能安装(宝塔导入数据库提示)

①我的2g内存腾讯云服务器想安装mysql8.0 ②宝塔提示“至少需要[3700MB]内存才能安装” 将数据库部署到宝塔上的时候提示-----》至少需要[XXXXMB]内存才能安装&#xff0c;解决的方法其实也很简单。 首先&#xff0c;进入文件夹/www/server/panel/class&#xff0c;找到找到…

PostgreSQL的学习心得和知识总结(一百三十八)|深入理解PostgreSQL数据库之Protocol message构造和解析逻辑

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

【Java开发指南 | 第十一篇】Java运算符

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 算术运算符关系运算符位运算符逻辑运算符赋值运算符条件运算符&#xff08;?:&#xff09;instanceof 运算符Java运算符优先级 Java运算符包括&#xff1a;算术运算符、关系运算符、位运算符、逻辑运算符、赋值…

Postman之版本信息查看

Postman之版本信息查看 一、为何需要查看版本信息&#xff1f;二、查看Postman的版本信息的步骤 一、为何需要查看版本信息&#xff1f; 不同的版本之间可能存在功能和界面的差异。 二、查看Postman的版本信息的步骤 1、打开 Postman 2、打开设置项 点击页面右上角的 “Set…

Java中的容器

Java中的容器主要包括以下几类&#xff1a; Collection接口及其子接口/实现类&#xff1a; List 接口及其实现类&#xff1a; ArrayList&#xff1a;基于动态数组实现的列表&#xff0c;支持随机访问&#xff0c;插入和删除元素可能导致大量元素移动。LinkedList&#xff1a;基…

只用键盘的技巧

技巧一&#xff1a;将常用软件固定在任务栏使用winnum/winT(shift)打开 技巧二&#xff1a;winX快捷键&#xff08;显示快捷键的快捷键&#xff09; ALT F4    关闭当前应用程序 技巧三&#xff1a;使用好Chrome快键键 ctrl h&#xff1b;历史纪录。 ctrl shift esc&am…

充电桩--OCPP 充电通讯协议介绍

一、OCPP协议介绍 OCPP的全称是 Open Charge Point Protocol 即开放充电点协议&#xff0c; 它是免费开放的协议&#xff0c;该协议由位于荷兰的组织 OCA&#xff08;开放充电联盟&#xff09;进行制定。Open Charge Point Protocol (OCPP) 开放充电点协议用于充电站(CS)和任何…

大模型开发轻松入门——(1)从搭建自己的环境开始

pip install openai import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv())openai.api_key os.getenv(OPENAI_API_KEY)

mac IDEA激活 亲测有效

1、官网下载mac版本IDEA并安装 2、打开激活页面 3、下载脚本文件 链接: https://pan.baidu.com/s/1I2BqdfxSJv1A96422rflnA?pwdm494 提取码: m494 4、命令行到该界面&#xff0c;执行 sudo bash idea.sh 可能出现的问题&#xff1a; 查看sh文件&#xff0c;targetFilePath…

vue快速入门(十六)事件修饰符

注释很详细&#xff0c;直接上代码 上一篇 新增内容 事件修饰符之阻止冒泡事件修饰符之阻止默认行为 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdev…