一. CSV 文件
以下内容,来自百度百科
一.一 CSV文件简介
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),
其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,
最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。
建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之一
一.二 规则
1 开头是不留空,以行为单位。
2 可含或不含列名,含列名则居文件第一行。
3 一行数据不跨行,无空行。
4 以半角逗号(即,)作分隔符,列为空也要表达其存在。
5列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。
6文件读写时引号,逗号操作规则互逆。
7内码格式不限,可为 ASCII、Unicode 或者其他。
8不支持数字
9不支持特殊字符
一.三 Csv文件举例
文件形式 形如:
id,name,sex,age,description 1,两个蝴蝶飞_1,男,21,我是第1个,我的名字是:两个蝴蝶飞_1 2,两个蝴蝶飞_2,女,22,我是第2个,我的名字是:两个蝴蝶飞_2 3,两个蝴蝶飞_3,男,23,我是第3个,我的名字是:两个蝴蝶飞_3 4,两个蝴蝶飞_4,女,24,我是第4个,我的名字是:两个蝴蝶飞_4 5,两个蝴蝶飞_5,男,25,我是第5个,我的名字是:两个蝴蝶飞_5 6,两个蝴蝶飞_6,女,26,我是第6个,我的名字是:两个蝴蝶飞_6 7,两个蝴蝶飞_7,男,27,我是第7个,我的名字是:两个蝴蝶飞_7 8,两个蝴蝶飞_8,女,28,我是第8个,我的名字是:两个蝴蝶飞_8 9,两个蝴蝶飞_9,男,29,我是第9个,我的名字是:两个蝴蝶飞_9 10,两个蝴蝶飞_10,女,30,我是第10个,我的名字是:两个蝴蝶飞_10
二. hutool 关于Csv处理的工具
官网地址是: CSV文件处理工具-CsvUtil
在 pom.xml 中添加依赖
<!--添加hutool-all, 处理csv文件解析--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.10</version> </dependency>
在 cn.hutool.core.text.csv 包下
接下来,老蝴蝶简单讲解一下.
对应的官方文档地址是: https://apidoc.gitee.com/loolly/hutool/
二.一 读取
二.一 .一 CsvReadConfig
/** 是否首行做为标题行,默认false */ protected boolean containsHeader; /** 是否跳过空白行,默认true */ protected boolean skipEmptyRows = true; /** 每行字段个数不同时是否抛出异常,默认false */ protected boolean errorOnDifferentFieldCount; /** 定义开始的行(包括),此处为原始文件行号 */ protected long beginLineNo; /** 结束的行(包括),此处为原始文件行号 */ protected long endLineNo = Long.MAX_VALUE-1;
在读取文件时,可以进行相应的配置.
注意,是否将首行默认为标题行 containsHeader 为 false
二.一.二 CsvReader
二.二 写入
二.二.一 CsvWriteConfig
写入文件时的配置
/** * 是否始终使用文本分隔符,文本包装符,默认false,按需添加 */ protected boolean alwaysDelimitText; /** * 换行符 */ protected char[] lineDelimiter = {CharUtil.CR, CharUtil.LF}; //对应的是 \r \n
二.二.二 CsvWriter
二.三 公共部分
二.三.一 总的封装数据 CsvData
public class CsvData implements Iterable<CsvRow>, Serializable { private static final long serialVersionUID = 1L; //标题行 private final List<String> header; //行数据 private final List<CsvRow> rows; }
二.三.二 每一行数据对象 CsvRow
public final class CsvRow implements List<String> { /** 原始行号 */ private final long originalLineNumber; //这一行的 标题和对应的索引位置 如 name 0 表示 name字段是在第0位,最开始的位置 final Map<String, Integer> headerMap; // 这一行的 内容 final List<String> fields; }
二.三.三 工具类 CsvUtil
基本就这些常用的信息,可以满足日常开发的相关需求.
写几个常见的例子,就明白怎么使用了.