欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實現(xiàn)CSV格式轉對象

 更新時間:2022年06月20日 09:52:05   作者:胡安民  
csv全稱“Comma-Separated Values”,是一種逗號分隔值格式的文件,常用來存儲數(shù)據(jù)的純文本格式文件。本文將用Java語言實現(xiàn)CSV轉對象,需要的可以參考一下

介紹

csv全稱“Comma-Separated Values”,是一種逗號分隔值格式的文件,是一種用來存儲數(shù)據(jù)的純文本格式文件。CSV文件由任意數(shù)目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串。

我找了找目前百度上基本是沒有這方面的快捷轉換方式和工具包,能找到的基本都不能通用寫死的,沒辦法只能自己寫一份出來,主要用到的技術,反射,泛型,類型轉換,構造者設計模式 ,以下代碼給提供一個思路,技術差不多的話基本上看了下面的代碼是能自己寫出來的,如果是入門級別的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 ;//數(shù)據(jù)
    private List<T> list=new ArrayList<>();//數(shù)據(jù)
    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實現(xiàn)CSV格式轉對象的詳細內容,更多關于Java CSV轉對象的資料請關注腳本之家其它相關文章!

相關文章

  • Java C++題解leetcode1620網絡信號最好的坐標

    Java C++題解leetcode1620網絡信號最好的坐標

    這篇文章主要為大家介紹了Java C++題解leetcode1620網絡信號最好的坐標示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Java????????HashMap遍歷方法匯總

    Java????????HashMap遍歷方法匯總

    這篇文章主要介紹了Java????????HashMap遍歷方法匯總,HashMap?的遍歷方法有很多種,不同的?JDK?版本有不同的寫法,下文關于其遍歷方法總結需要的小伙伴可以參考一下
    2022-05-05
  • Spring?Boot?Actuator管理日志的實現(xiàn)

    Spring?Boot?Actuator管理日志的實現(xiàn)

    本文主要介紹了Spring?Boot?Actuator管理日志的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 歸并算法之有序數(shù)組合并算法實現(xiàn)

    歸并算法之有序數(shù)組合并算法實現(xiàn)

    這篇文章主要介紹了歸并算法之有序數(shù)組合并算法實現(xiàn)的相關資料,需要的朋友可以參考下
    2017-07-07
  • Java?C++題解eetcode940不同的子序列?II

    Java?C++題解eetcode940不同的子序列?II

    這篇文章主要為大家介紹了Java?C++題解eetcode940不同的子序列?II實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 淺談Storm在zookeeper上的目錄結構

    淺談Storm在zookeeper上的目錄結構

    這篇文章主要介紹了淺談Storm在zookeeper上的目錄結構的相關內容,涉及storm使用zookeeper的操作以及詳細結構圖,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Java NIO中的零拷貝原理

    Java NIO中的零拷貝原理

    這篇文章主要介紹了Java NIO中的零拷貝原理,零拷貝即Zero-Copy,顧名思義,零拷貝是指的一種非拷貝的方式來減少IO次數(shù)的工作方式,零拷貝的作用就是減少IO,提高IO效率,需要的朋友可以參考下
    2023-11-11
  • Java桶排序之基數(shù)排序詳解

    Java桶排序之基數(shù)排序詳解

    這篇文章主要為大家介紹了Java桶排序之基數(shù)排序,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • Java程序的初始化順序,static{}靜態(tài)代碼塊和實例語句塊的使用方式

    Java程序的初始化順序,static{}靜態(tài)代碼塊和實例語句塊的使用方式

    這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實例語句塊的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • java線程池ThreadPoolExecutor類使用小結

    java線程池ThreadPoolExecutor類使用小結

    這篇文章主要介紹了java線程池ThreadPoolExecutor類使用,本文主要對ThreadPoolExecutor的使用方法進行一個詳細的概述,示例代碼介紹了ThreadPoolExecutor的構造函數(shù)的相關知識,感興趣的朋友一起看看吧
    2022-03-03

最新評論