Java实现CSV格式转对象

 更新时间:2022年06月20日 09:52:05   作者:胡安民  
csv全称“Comma-Separated Values”,是一种逗号分隔值格式的文件,常用来存储数据的纯文本格式文件。本文将用Java语言实现CSV转对象,需要的可以参考一下

介紹

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);
        }
    }

    //
}

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

相关文章

  • SpringBoot整合Mongodb实现增删查改的方法

    SpringBoot整合Mongodb实现增删查改的方法

    这篇文章主要介绍了SpringBoot整合Mongodb实现简单的增删查改,MongoDB是一个以分布式数据库为核心的数据库,因此高可用性、横向扩展和地理分布是内置的,并且易于使用。况且,MongoDB是免费的,开源的,感兴趣的朋友跟随小编一起看看吧
    2022-05-05
  • java实现上传图片尺寸修改和质量压缩

    java实现上传图片尺寸修改和质量压缩

    这篇文章主要为大家详细介绍了java实现上传图片尺寸修改和质量压缩,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • SpringBoot集成Swagger使用SpringSecurity控制访问权限问题

    SpringBoot集成Swagger使用SpringSecurity控制访问权限问题

    这篇文章主要介绍了SpringBoot集成Swagger使用SpringSecurity控制访问权限问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • jedis获取redis中二进制图片转Base64方式

    jedis获取redis中二进制图片转Base64方式

    这篇文章主要介绍了jedis获取redis中二进制图片转Base64方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • MybatisPlus处理四种表与实体的映射及id自增策略分析

    MybatisPlus处理四种表与实体的映射及id自增策略分析

    在最近的工作中,碰到一个比较复杂的返回结果,发现简单映射已经解决不了这个问题了,只好去求助百度,学习mybatis表与实体的映射应该怎么写,将学习笔记结合工作碰到的问题写下本文,供自身查漏补缺,同时已被不时之需
    2022-10-10
  • java Iterator.remove()实例方法分析

    java Iterator.remove()实例方法分析

    在本篇文章里小编给大家整理了一篇关于java Iterator.remove()实例方法分析,有兴趣的朋友们跟着学习下。
    2021-01-01
  • java腾讯AI人脸对比对接代码实例

    java腾讯AI人脸对比对接代码实例

    这篇文章主要介绍了java腾讯AI人脸对比对接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Spring boot 整合 Redisson实现分布式锁并验证功能

    Spring boot 整合 Redisson实现分布式锁并验证功能

    这篇文章主要介绍了Spring boot 整合 Redisson实现分布式锁并验证,redisson是官方推荐的分布式锁实现方案,采用redis自身的原子命令和lua脚本来实现,需要的朋友可以参考下
    2022-05-05
  • Springboot 如何使用@Async整合线程池

    Springboot 如何使用@Async整合线程池

    这篇文章主要介绍了Springboot 使用@Async整合线程池的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • spring webflux响应式编程使用详解

    spring webflux响应式编程使用详解

    webflux,即响应式编程,响应式编程是一种用于处理异步数据流和事件的编程范式,spring webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架,本文给大家详细讲讲spring webflux响应式编程的使用,需要的朋友可以参考下
    2023-10-10

最新评论