摘要:基于注解生成加签验签。是否写入头,建议第一次写入指定,避免中文乱码指定文件编码默认不进行字段排序无待写入的文件列表方法默认值说明必填创建实例,并且指定待读取文件路径。
csv
基于 java 注解生成加签验签 csv。
开源地址: github csv
)
以前觉得 csv 文件的多写非常简单,就懒得封装。
最近一个月写了两次 csv 文件相关的东西,发现要处理的细节还是有的,还浪费比较多的时间。
比如:
UTF-8 中文编码使用 excel 打开乱码,因为缺少 BOM 头。
不同类型字段转化为字符串,顺序的指定,head 头的指定,如果手写都会很繁琐。
读取的时候最后 , 后无元素,split 会缺失等。
为了解决上述问题,此框架应运而生。
特性Fluent 流式写法
基于 java 注解
字段类型转换的灵活支持,内置 8 大基本类型以及 String 类型转换
快速开始 环境jdk7+
maven 3.x
maven 引入示例代码com.github.houbb csv 0.0.2
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写入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 est esourcescommon.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 est esourcescommon.csv"; ListuserList = 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 有两个引导类:
名称 | 作用 |
---|---|
CsvWriteBs | csv 文件写入引导类 |
CsvReadBs | csv 文件读取引导类 |
方法 | 默认值 | 说明 |
---|---|---|
newInstance(final String path) | 必填 | 创建实例,并且指定待写入文件路径。 |
writeBom(boolean writeBom) | true | 是否写入 UTF8 BOM 头,建议第一次写入指定,避免中文乱码 |
charset(String charset) | UTF-8 | 指定文件编码 |
sort(ISort sort) | NoSort | 默认不进行字段排序 |
write(List |
无 | 待写入的文件列表 |
方法 | 默认值 | 说明 |
---|---|---|
newInstance(final String path) | 必填 | 创建实例,并且指定待读取文件路径。 |
charset(String charset) | UTF-8 | 指定文件编码 |
sort(ISort sort) | NoSort | 默认不进行字段排序 |
startIndex(int startIndex) | 1 | 文件的第二行,默认第一行是 head |
endIndex(int endIndex) | 文件的最后一行 |
用于待处理对象的字段上。
/** * 字段显示名称 * 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 头生成 |
readRequire | true | 是否需要从 csv 文件读取 |
writeRequire | true | 当前字段是否需要写入 csv 文件 |
readConverter | CommonReadConverter | 将 csv 中的字符串转化为当前字段类型,支持 8 大基本类型+String |
writeConverter | StringWriteConverter | 直接调用当前字段值 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{ @Override public String convert(Date value) { DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); return dateFormat.format(value); } }
ReadDateConvert
public class ReadDateConvert implements IReadConverter写入文件{ @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 est esourcesannotation.csv"; CsvWriteBs.newInstance(path) .write(buildAnnotationList()); }
其中列表构建:
/** * 构建基于注解的测试列表 * @return 列表 */ private ListbuildAnnotationList() { UserAnnotation user = new UserAnnotation(); user.name("你好") .password("123") .birthday(new Date()); return Arrays.asList(user); }
生成文件内容
名称,生日 你好,20190603读取文件测试
public void annotationTest() { final String path = "src est esourcesannotation.csv"; ListuserList = CsvReadBs.newInstance(path) .read(UserAnnotation.class); System.out.println(userList); }
日志信息
[UserAnnotation{name="你好", password="null", birthday=Mon Jun 03 00:00:00 CST 2019}]
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/74784.html
摘要:创作原由以前觉得文件的读写非常简单,就懒得封装。为了解决上述问题,此框架应运而生。写入文件其中列表构建构建基于注解的测试列表列表你好生成文件内容名称生日你好读取文件测试日志信息你好集合类有时候对象中会包含数组等常见集合。 CSV 基于 java 注解的 csv 读写框架。 相关框架 Apache commons-csv super-csv 简单看了下,这两个框架提供的特性都非常的基础。...
摘要:集合类有时候对象中会包含数组等常见集合。为了存储的便利性,默认提供集合的相关支持。特性和普通字段保持一致,如果指定注解转换,则以注解为准。集合使用进行分隔,其中的分隔,用到了。在使用时要注意,不要包含上述的符号,否则会出现解析错乱。 集合类 有时候对象中会包含数组、Map、Collection 等常见集合。 为了存储的便利性,默认提供集合的相关支持。 特性和普通字段保持一致,如果指定注...
摘要:本次分享将介绍如何在中使用库实现数据库的读写。提供了工具包及对象关系映射工具,使用许可证发行。模块实现了与不同数据库的连接,而模块则使得能够操作数据库。 本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写。首先我们需要了解点ORM方面的知识。 ORM技术 对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是把关...
阅读 2829·2021-09-10 10:50
阅读 2192·2019-08-29 16:06
阅读 3194·2019-08-29 11:02
阅读 1092·2019-08-26 14:04
阅读 2801·2019-08-26 13:24
阅读 2300·2019-08-26 12:16
阅读 549·2019-08-26 10:29
阅读 3092·2019-08-23 18:33