Java CSV转对象
胡安民 人气:0介紹
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<T> extends ParameterizedTypeReference<T> { private String separator ; //默认分隔符 private List<String> objects ;//数据 private List<T> list=new ArrayList<>();//数据 private Map<String,String> fieldsTypes = new LinkedHashMap<>(); public CSVToObj(List<String> objects,String separator) { //特殊符号的处理 this.separator = PatternCommon.division(separator); this.objects=objects; } //列,映射,转换的时候会和映射的顺序保持一致 ,默认使用当前文件的分隔符作为切割 public CSVToObj<T> 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<T> 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<T> 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<String> list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile); //做映射,然后转换csv格式为实体对象 List<UserData> result = new CSVToObj<UserData>(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<String> list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile); List<UserData> result = new CSVToObj<UserData>(list, "|"){}.mapping(head).transform().result(); for (UserData userData : result) { System.out.println(userData); } } // }
加载全部内容