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

CSVWriter
        public 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();

CSVReader
        public 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();
Strategy
    ColumnPositionMappingStrategy
    HeaderColumnNameMappingStrategy
    HeaderColumnNameTranslateMappingStrategy

自定义的符号:

  • 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;

    @CsvBindByName
    private 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()
}
@Test
 public 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);
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

专业清洁工匠服务网站模板 html网站

目录 一.前言 二.页面展示 三.下载链接 一.前言 该HTML代码生成了一个网页&#xff0c;包括以下内容&#xff1a; 头部信息&#xff1a;指定了网页的基本设置和元数据&#xff0c;例如字符编码、视口大小等。CSS文件&#xff1a;引入了多个CSS文件&#xff0c;用于设置网页…

书籍架构:一本书的透视骨架

书籍架构:一本书的透视骨架 我们在书籍排版过程中涉及到专用术语,从事出版工作及设计工作的你来说掌握这些尤为重要。 很多新手在出版第一本书时,对于书籍的结构还不是很了解,下面就让我们一起来了解、掌握出书知识。 书,由两部分构成:书皮和书心。 其中…… 书皮 书皮…

pytest学习-pytorch单元测试

pytorch单元测试 一.公共模块[common.py]二.普通算子测试[test_clone.py]三.集合通信测试[test_ccl.py]四.测试命令五.测试报告 希望测试pytorch各种算子、block、网络等在不同硬件平台,不同软件版本下的计算误差、耗时、内存占用等指标. 本文基于torch.testing._internal 一…

sql知识总结二

一.报错注入 1.什么是报错注入&#xff1f; 这是一种页面响应形式&#xff0c;响应过程如下&#xff1a; 用户在前台页面输入检索内容----->后台将前台输入的检索内容无加区别的拼接成sql语句&#xff0c;送给数据库执行------>数据库将执行的结果返回给后台&#xff…

Java 集合(ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet)【补充复习】

Java 集合&#xff08;ArrayList、LinkedList、HashMap、HashSet、LinkedHashMap、LinkedHashSet&#xff09;【补充复习】 Java 集合概述Collection 接口继承树Map 接口继承树 Collection 接口方法使用 iterator 接口遍历集合元素使用 forearch 遍历集合元素 List 接口List 实…

媒体邀约的好处?怎么邀请媒体?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约的好处主要体现在提高品牌知名度、扩大受众群体以及与媒体建立良好的合作关系。 媒体邀约是一种有效的公关策略&#xff0c;通过吸引媒体关注来促进信息的传播。它可以帮助组织…

传统大数据架构与现代数据平台的期望——Lakehouse 架构(二)

文章目录 前言数据仓库数仓基础好处和优势限制和挑战 数据湖数据湖基础好处和优势限制和挑战 现代数据平台云数据湖与云数仓组合架构现代数据平台的期望Lakehouse 架构的出现未来数据平台的默认选择&#xff1f; 总结 前言 本文概述了传统数据架构&#xff1a;数据仓库和数据湖…

【Linux系列】Ctrl + R 的使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

python后端相关知识点汇总(十二)

python知识点汇总十二 1、什么是 C/S 和 B/S 架构2、count(1)、count(*)、count(列名)有啥区别&#xff1f;3、如何使用线程池3.1、为什么使用线程池&#xff1f; 4、MySQL 数据库备份命令5、supervisor和Gunicorn6、python项目部署6.1、entrypoint.sh制作6.2、Dockerfile制作6…

8.Jetson AGX Orin Ubuntu20.04 gRPC编译安装

Jetson AGX Orin Ubuntu20.04 gRPC编译安装 一、CMake版本检查 grpc编译cmake要求最低版本为3.15。首先&#xff0c;cmake -version 查看当前cmake版本&#xff0c;如果低于3.15&#xff0c;按照以下步骤进行安装。 1.1 卸载已经安装的旧版的CMake sudo apt-get autoremove…

Redmi Turbo 3新品发布,天星金融(原小米金融)优惠加持护航新机体验

Redmi新十年使命不变&#xff0c;挑战不断升级。Redmi Turbo 3&#xff0c;作为Turbo系列的开篇之作&#xff0c;将自身定位为新生代性能旗舰&#xff0c;决心重塑中端性能新格局。据悉&#xff0c;Redmi Turbo 3于4月10日已正式发布。预售期间更是连续数日&#xff0c;蝉联小米…

mac终端使用代理加速下载

环境变量增加前IP&#xff1a; 环境变量配置后&#xff0c;新打开一个终端的ip&#xff0c;开始享受极速吧~

【Python基础】MySQL

文章目录 [toc]创建数据库创建数据表数据插入数据查询数据更新 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 学习指南&#xff1a;Python学习指南 创建数据库 import pymysqldef create_database():db pymysql.connect(hostlocalhost, userroot, passwordr…

【GIS教程】土地利用转移矩阵、土地利用面积变化

随着科技社会的不断进步&#xff0c;人类活动对地理环境的影响与塑造日益明显&#xff0c;土地不断的侵蚀与改变也导致一系列的环境问题日益突出。土地利用/覆盖&#xff08;LUCC&#xff09;作为全球环境变化研究的重点问题为越来越多的国际研究机构所重视&#xff0c;研究它的…

Python大数据分析——岭回归和LASSO回归模型

Python大数据分析——岭回归和LASSO回归模型 模型原因列数多于行数变量和变量间存在多重共线性 岭回归模型理论分析函数示例 LASSO回归模型理论分析函数示例 模型原因 我们为什么要有岭回归和LASSO回归呢&#xff1f; 因为根据线性回归模型的参数估计公式β(X’X)-1X’y可知&…

3DGS渐进式渲染 - 离线生成渲染视频

总览 输入&#xff1a;环绕Object拍摄的RGB视频 输出&#xff1a;自定义相机路径的渲染视频&#xff08;包含渐变效果&#xff09; 实现过程 首先&#xff0c;编译3DGS的C代码&#xff0c;并跑通convert.py、train.py和render.py。教程如下&#xff1a; github网址&#xf…

HarmonyOS开发实例:【分布式手写板】

介绍 本篇Codelab使用设备管理及分布式键值数据库能力&#xff0c;实现多设备之间手写板应用拉起及同步书写内容的功能。操作流程&#xff1a; 设备连接同一无线网络&#xff0c;安装分布式手写板应用。进入应用&#xff0c;点击允许使用多设备协同&#xff0c;点击主页上查询…

spring06:mybatis-spring(Spring整合MyBatis)

spring06&#xff1a;mybatis-spring&#xff08;Spring整合MyBatis&#xff09; 文章目录 spring06&#xff1a;mybatis-spring&#xff08;Spring整合MyBatis&#xff09;前言&#xff1a;什么是 MyBatis-Spring&#xff1f;MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合…

【VIC水文模型】准备工作:平台软件安装

VIC水文模型所需平台软件安装 1 Arcgis安装2 Cygwin安装&#xff08;Linux系统&#xff09;3 Matlab/R/Fortran的安装Notepad 4 VIC模型程序代码获取参考 由于VIC模型的编程语言为C语言&#xff0c;交互方式为控制台输指令&#xff0c;需要在Linux系统上运行。Windows 上使用 …

简述PDF原理和实践

Hello&#xff0c;我是小恒不会java。 由于最近有输出PDF报表的项目需求&#xff0c;所以复习一下PDF到底是什么&#xff0c;该如何产生&#xff0c;如何应用至项目中。 更多参见Adobe官方文档&#xff08;https://www.adobe.com/cn/&#xff09; PDF原理 PDF&#xff08;Port…