Java-CSV转对象

x33g5p2x  于2022-06-30 转载在 Java  
字(3.7k)|赞(0)|评价(0)|浏览(510)

介紹

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

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

参考代码

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

  1. package com.file.csv;
  2. import com.obj.converter.Converter;
  3. import com.reflect.ReflectUtil;
  4. import com.string.PatternCommon;
  5. import lombok.SneakyThrows;
  6. import org.springframework.core.ParameterizedTypeReference;
  7. import java.lang.reflect.Field;
  8. import java.util.ArrayList;
  9. import java.util.LinkedHashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. /**
  13. * csv转对象
  14. * @Author: huanmin
  15. * @Date: 2022/6/18 15:59
  16. * @Version: 1.0
  17. * @Description: 文件作用详细描述....
  18. */
  19. public class CSVToObj<T> extends ParameterizedTypeReference<T> {
  20. private String separator ; //默认分隔符
  21. private List<String> objects ;//数据
  22. private List<T> list=new ArrayList<>();//数据
  23. private Map<String,String> fieldsTypes = new LinkedHashMap<>();
  24. public CSVToObj(List<String> objects,String separator) {
  25. //特殊符号的处理
  26. this.separator = PatternCommon.division(separator);
  27. this.objects=objects;
  28. }
  29. //列,映射,转换的时候会和映射的顺序保持一致 ,默认使用当前文件的分隔符作为切割
  30. public CSVToObj<T> mapping(String fieldNames){
  31. String[] split = fieldNames.split(separator);
  32. Class<? extends CSVToObj> aClass = ReflectUtil.deSerializable(getClass(),0);
  33. Field[] declaredFields = aClass.getDeclaredFields();
  34. for (String s : split) {
  35. for (Field declaredField : declaredFields) {
  36. declaredField.setAccessible(true);
  37. if(s.equals(declaredField.getName())){
  38. fieldsTypes.put(declaredField.getName(), declaredField.getType().getTypeName());
  39. }
  40. }
  41. }
  42. return this;
  43. }
  44. @SneakyThrows
  45. public CSVToObj<T> transform(){
  46. Class<? extends CSVToObj> aClass = ReflectUtil.deSerializable(getClass(),0);
  47. for (String object : objects) {
  48. String[] split = object.split(separator);
  49. T o = (T)aClass.newInstance();
  50. Field[] declaredFields = o.getClass().getDeclaredFields();
  51. for (int i = 0; i < declaredFields.length; i++) {
  52. Field declaredField = declaredFields[i];
  53. declaredField.setAccessible(true);
  54. if (fieldsTypes.containsKey(declaredField.getName())) {
  55. declaredField.set(o, Converter.cast(split[i],fieldsTypes.get(declaredField.getName())));
  56. }
  57. }
  58. list.add(o);
  59. }
  60. return this;
  61. }
  62. public List<T> result(){
  63. return list;
  64. }
  65. }

测试用例

  1. package com.file;
  2. import com.entity.UserData;
  3. import com.file.csv.CSVToObj;
  4. import com.file.csv.ReadAndWriteFileCSV;
  5. import com.path.ResourceFileUtil;
  6. import org.junit.Test;
  7. import java.io.File;
  8. import java.util.List;
  9. /**
  10. * csv转对象测试
  11. *
  12. * @Author: huanmin
  13. * @Date: 2022/6/18 16:44
  14. * @Version: 1.0
  15. * @Description: 文件作用详细描述....
  16. */
  17. public class CSVToObjTest {
  18. @Test
  19. public void show1(){
  20. File absoluteFileOrDirPathAndCreateNewFile = ResourceFileUtil.getAbsoluteFileOrDirPathAndCreateNewFile("/file/text.csv");
  21. //读取头部对应字段
  22. String head = ReadAndWriteFileCSV.readFirstLineOne(absoluteFileOrDirPathAndCreateNewFile);
  23. //去掉头部和尾部的多余信息,只显示内容
  24. List<String> list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile);
  25. //做映射,然后转换csv格式为实体对象
  26. List<UserData> result = new CSVToObj<UserData>(list, "|"){}.mapping(head).transform().result();
  27. for (UserData userData : result) {
  28. System.out.println(userData);
  29. }
  30. }
  31. @Test
  32. public void show2(){
  33. File absoluteFileOrDirPathAndCreateNewFile = ResourceFileUtil.getAbsoluteFileOrDirPathAndCreateNewFile("/file/text.csv");
  34. //手动指定文件头部
  35. String head ="id|name|pass|age|sex|site";
  36. //去掉头部和尾部的多余信息,只显示内容
  37. List<String> list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile);
  38. List<UserData> result = new CSVToObj<UserData>(list, "|"){}.mapping(head).transform().result();
  39. for (UserData userData : result) {
  40. System.out.println(userData);
  41. }
  42. }
  43. //
  44. }

点赞 -收藏-关注-便于以后复习和收到最新内容有其他问题在评论区讨论-或者私信我-收到会在第一时间回复如有侵权,请私信联系我感谢,配合,希望我的努力对你有帮助^_^

相关文章

最新文章

更多