Java实现CSV格式转对象

网友投稿 777 2022-07-22


目录介紹参考代码测试用例

介紹

csv全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,是一种用来存储数据的纯文本格式文件。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串。

我找了找目前百度上基本是没有这方面的快捷转换方式和工具包,能找到的基本都不能通用写死的,没办法只能自己写一份出来,主要用到的技术,反射,泛型,类型转换,构造者设计模式 ,以下代码给提供一个思路,技术差不多的话基本上看了下面的代码是能自己写出来的,如果是入门级别的java程序员就自行跳过本博客

参考代码

部分工具类的代码没有展示, 这里就粘贴主要核心原理,很简单,自己也是能编写出来的

package com.file.csv;

import com.obj.converter.Converter;

import com.reflect.ReflectUtil;

import com.string.PatternCommon;

import lombok.SneakyThrows;

import org.springframework.core.ParameterizedTypeReference;

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.LinkedHashMap;

import java.util.List;

import java.util.Map;

/**

* csv转对象

* @Author: huanmin

* @Date: 2022/6/18 15:59

* @Version: 1.0

* @Description: 文件作用详细描述....

*/

public class CSVToObj extends ParameterizedTypeReference {

private String separator ; //默认分隔符

private List objects ;//数据

private List list=new ArrayList<>();//数据

private Map fieldsTypes = new LinkedHashMap<>();

public CSVToObj(List objects,String separator) {

//特殊符号的处理

this.separator = PatternCommon.division(separator);

this.objects=objects;

}

//列,映射,转换的时候会和映射的顺序保持一致 ,默认使用当前文件的分隔符作为切割

public CSVToObj mapping(String fieldNames){

String[] split = fieldNames.split(separator);

Class extends CSVToObj> aClass = ReflectUtil.deSerializable(getClass(),0);

Field[] declaredFields = aClass.getDeclaredFields();

for (String s : split) {

for (Field declaredField : declaredFields) {

declaredField.setAccessible(true);

if(s.equals(declaredField.getName())){

fieldsTypes.put(declaredField.getName(), declaredField.getType().getTypeName());

}

}

}

return this;

}

@SneakyThrows

public CSVToObj transform(){

Class extends CSVToObj> aClass = ReflectUtil.deSerializable(getClass(),0);

for (String object : objects) {

String[] split = object.split(separator);

T o = (T)aClass.newInstance();

Field[] declaredFields = o.getClass().getDeclaredFields();

for (int i = 0; i < declaredFields.length; i++) {

Field declaredField = declaredFields[i];

declaredField.setAccessible(true);

if (fieldsTypes.containsKey(declaredField.getName())) {

declaredField.set(o, Converter.cast(split[i],fieldsTypes.get(declaredField.getName())));

}

}

list.add(o);

}

return this;

}

public List result(){

return list;

}

}

测试用例

package com.file;

import com.entity.UserData;

import com.file.csv.CSVToObj;

import com.file.csv.ReadAndWriteFileCSV;

import com.path.ResourceFileUtil;

import org.junit.Test;

import java.io.File;

import java.util.List;

/**

* csv转对象测试

*

* @Author: huanmin

* @Date: 2022/6/18 16:44

* @Version: 1.0

* @Description: 文件作用详细描述....

*/

public class CSVToObjTest {

@Test

public void show1(){

File absoluteFileOrDirPathAndCreateNewFile = ResourceFileUtil.getAbsoluteFileOrDirPathAndCreateNewFile("/file/text.csv");

//读取头部对应字段

String head = ReadAndWriteFileCSV.readFirstLineOne(absoluteFileOrDirPathAndCreateNewFile);

//去掉头部和尾部的多余信息,只显示内容

List list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile);

//做映射,然后转换csv格式为实体对象

List result = new CSVToObj(list, "|"){}.mapping(head).transform().result();

for (UserData userData : result) {

System.out.println(userData);

}

}

@Test

public void show2(){

File absoluteFileOrDirPathAndCreateNewFile = ResourceFileUtil.getAbsoluteFileOrDirPathAndCreateNewFile("/file/text.csv");

//手动指定文件头部

String head ="id|name|pass|age|sex|site";

//去掉头部和尾部的多余信息,只显示内容

List list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile);

List result = new CSVToObj(list, "|"){}.mapping(head).transform().result();

for (UserData userData : result) {

System.out.println(userData);

}

}

//

}

以上就是Java实现CSV格式转对象的详细内容,更多关于Java CSV转对象的资料请关注我们其它相关文WEgrXijrq章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Eclipse IDE中如何设置JVM启动参数
下一篇:关于Maven混合配置私有仓库和公共仓库的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~