资讯专栏INFORMATION COLUMN

基于 java 注解的 csv 文件读写框架

Gemini / 1009人阅读

摘要:基于注解生成加签验签。是否写入头,建议第一次写入指定,避免中文乱码指定文件编码默认不进行字段排序无待写入的文件列表方法默认值说明必填创建实例,并且指定待读取文件路径。

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";
    List 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 有两个引导类:

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

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

    /**
     * 字段显示名称
     * 1. 默认使用 field.name
     * @return 显示名称
     */
    String label() default "";

    /**
     * 读取是否需要
     * @return 是
     */
    boolean readRequire() default true;

    /**
     * 写入是否需要
     * @return 是
     */
    boolean writeRequire() default true;

    /**
     * 读取转换
     * @return 处理实现类
     */
    Class readConverter() default CommonReadConverter.class;

    /**
     * 写入转换
     * @return 处理实现类
     */
    Class 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 List buildAnnotationList() {
    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";
     List userList = 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

相关文章

  • 基于 java 注解 csv 读写框架更加简单灵活

    摘要:创作原由以前觉得文件的读写非常简单,就懒得封装。为了解决上述问题,此框架应运而生。写入文件其中列表构建构建基于注解的测试列表列表你好生成文件内容名称生日你好读取文件测试日志信息你好集合类有时候对象中会包含数组等常见集合。 CSV 基于 java 注解的 csv 读写框架。 相关框架 Apache commons-csv super-csv 简单看了下,这两个框架提供的特性都非常的基础。...

    includecmath 评论0 收藏0
  • CSV-03- csv 读写框架支持数组、Map、Collection 等常见集合

    摘要:集合类有时候对象中会包含数组等常见集合。为了存储的便利性,默认提供集合的相关支持。特性和普通字段保持一致,如果指定注解转换,则以注解为准。集合使用进行分隔,其中的分隔,用到了。在使用时要注意,不要包含上述的符号,否则会出现解析错乱。 集合类 有时候对象中会包含数组、Map、Collection 等常见集合。 为了存储的便利性,默认提供集合的相关支持。 特性和普通字段保持一致,如果指定注...

    leiyi 评论0 收藏0
  • Python之使用Pandas库实现MySQL数据库读写

    摘要:本次分享将介绍如何在中使用库实现数据库的读写。提供了工具包及对象关系映射工具,使用许可证发行。模块实现了与不同数据库的连接,而模块则使得能够操作数据库。   本次分享将介绍如何在Python中使用Pandas库实现MySQL数据库的读写。首先我们需要了解点ORM方面的知识。 ORM技术   对象关系映射技术,即ORM(Object-Relational Mapping)技术,指的是把关...

    darcrand 评论0 收藏0

发表评论

0条评论

Gemini

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<