csv

基于 java 注解生成加签验签 csv。

开源地址: " rel="nofollow">github csv

创作原由

以前觉得 csv 文件的多写非常简单,就懒得封装。

最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,还浪费比较多的时间。

比如:

UTF-8 中文编码使用 excel 打开乱码,因为缺少 BOM 头。

不同类型字段转化为字符串,顺序的指定,head 头的指定,如果手写都会很繁琐。

读取的时候最后 , 后无元素,split 会缺失等。

为了解决上述问题,此框架应运而生。

特性

Fluent 流式写法

基于 java 注解

字段类型转换的灵活支持,内置 8 大基本类型以及 String 类型转换快速开始环境

jdk7+

maven 3.x

maven 引入

<dependency> <groupId>com.github.houbb</groupId> <artifactId>csv</artifactId> <version>0.0.2</version></dependency>示例代码User.java

演示基本类型的转换

public class User { private String name; private int age; private float score; private double money; private boolean sex; private short level; private long id; private char status; private byte coin; //Getter & Setter & toString()}对象列表构建

/** * 构建通用测试列表 * @return 列表 */ private List<User> buildCommonList() { User user = new User(); short s = 4; byte b = 1; user.age(10) .name("你好") .id(1L) .score(60) .coin(b) .level(s) .money(200) .sex(true) .status('Y'); return Arrays.asList(user); }写入测试代码

public void commonTest() { final String path = "src\\test\\resources\\common.csv"; CsvWriteBs.newInstance(path) .write(buildCommonList());}文件生成

name,age,score,money,sex,level,id,status,coin你好,10,60.0,200.0,true,4,1,Y,1读取

public void commonTest() { final String path = "src\\test\\resources\\common.csv"; List<User> userList = CsvReadBs.newInstance(path) .read(User.class); System.out.println(userList);}日志信息

[User{name='你好', age=10, score=60.0, money=200.0, sex=true, level=4, id=1, status=Y, coin=1}]CSV 引导类

为了用户使用的便利性,和后期拓展的灵活性。

引导类

CSV 有两个引导类:

名称作用CsvWriteBscsv 文件写入引导类CsvReadBscsv 文件读取引导类CsvWriteBs方法默认值说明newInstance(final String path)必填创建实例,并且指定待写入文件路径。writeBom(boolean writeBom)true是否写入 UTF8 BOM 头,建议第一次写入指定,避免中文乱码charset(String charset)UTF-8指定文件编码sort(ISort sort)NoSort默认不进行字段排序write(List<T> list)待写入的文件列表CsvReadBs方法默认值说明newInstance(final String path)必填创建实例,并且指定待读取文件路径。charset(String charset)UTF-8指定文件编码sort(ISort sort)NoSort默认不进行字段排序startIndex(int startIndex)1文件的第二行,默认第一行是 headendIndex(int endIndex)文件的最后一行Csv 注解注解属性说明

用于待处理对象的字段上。

/** * 字段显示名称 * 1. 默认使用 field.name * @return 显示名称 */ String label() default ""; /** * 读取是否需要 * @return 是 */ boolean readRequire() default true; /** * 写入是否需要 * @return 是 */ boolean writeRequire() default true; /** * 读取转换 * @return 处理实现类 */ Class<? extends IReadConverter> readConverter() default CommonReadConverter.class; /** * 写入转换 * @return 处理实现类 */ Class<? extends IWriteConverter> writeConverter() default StringWriteConverter.class;属性概览表属性默认值说明label字段名称用于 csv 头生成readRequiretrue是否需要从 csv 文件读取writeRequiretrue当前字段是否需要写入 csv 文件readConverterCommonReadConverter将 csv 中的字符串转化为当前字段类型,支持 8 大基本类型+StringwriteConverterStringWriteConverter直接调用当前字段值 toString() 方法,null 直接为空字符串

其中 readConverter/writeConverter 支持用户自定义

注解使用代码示例对象定义

public class UserAnnotation { @Csv(label = "名称") private String name; @Csv(label = "密码", readRequire = false, writeRequire = false) private String password; @Csv(label = "生日", readConverter = ReadDateConvert.class, writeConverter = WriteDateConvert.class) private Date birthday; //Getter & Setter & toString()}ReadDateConvert/WriteDateConvert

使我们自定义的针对 Date 的转换实现。

Write

public class WriteDateConvert implements IWriteConverter<Date> { @Override public String convert(Date value) { DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); return dateFormat.format(value); }}ReadDateConvert

public class ReadDateConvert implements IReadConverter<Date> { @Override public Date convert(String value, Class fieldType) { try { DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); return dateFormat.parse(value); } catch (ParseException e) { throw new RuntimeException(e); } }}写入文件

public void annotationTest() { final String path = "src\\test\\resources\\annotation.csv"; CsvWriteBs.newInstance(path) .write(buildAnnotationList());}

其中列表构建:

/** * 构建基于注解的测试列表 * @return 列表 */private List<UserAnnotation> buildAnnotationList() { UserAnnotation user = new UserAnnotation(); user.name("你好") .password("123") .birthday(new Date()); return Arrays.asList(user);}生成文件内容

名称,生日你好,20190603读取文件测试

public void annotationTest() { final String path = "src\\test\\resources\\annotation.csv"; List<UserAnnotation> userList = CsvReadBs.newInstance(path) .read(UserAnnotation.class); System.out.println(userList);}日志信息

[UserAnnotation{name='你好', password='null', birthday=Mon Jun 03 00:00:00 CST 2019}]