Java實(shí)現(xiàn)CSV格式轉(zhuǎn)對象
介紹
csv全稱“Comma-Separated Values”,是一種逗號分隔值格式的文件,是一種用來存儲數(shù)據(jù)的純文本格式文件。CSV文件由任意數(shù)目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串。
我找了找目前百度上基本是沒有這方面的快捷轉(zhuǎn)換方式和工具包,能找到的基本都不能通用寫死的,沒辦法只能自己寫一份出來,主要用到的技術(shù),反射,泛型,類型轉(zhuǎn)換,構(gòu)造者設(shè)計(jì)模式 ,以下代碼給提供一個(gè)思路,技術(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轉(zhuǎn)對象 * @Author: huanmin * @Date: 2022/6/18 15:59 * @Version: 1.0 * @Description: 文件作用詳細(xì)描述.... */ public class CSVToObj<T> extends ParameterizedTypeReference<T> { private String separator ; //默認(rèn)分隔符 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; } //列,映射,轉(zhuǎn)換的時(shí)候會和映射的順序保持一致 ,默認(rèn)使用當(dāng)前文件的分隔符作為切割 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轉(zhuǎn)對象測試 * * @Author: huanmin * @Date: 2022/6/18 16:44 * @Version: 1.0 * @Description: 文件作用詳細(xì)描述.... */ public class CSVToObjTest { @Test public void show1(){ File absoluteFileOrDirPathAndCreateNewFile = ResourceFileUtil.getAbsoluteFileOrDirPathAndCreateNewFile("/file/text.csv"); //讀取頭部對應(yīng)字段 String head = ReadAndWriteFileCSV.readFirstLineOne(absoluteFileOrDirPathAndCreateNewFile); //去掉頭部和尾部的多余信息,只顯示內(nèi)容 List<String> list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile); //做映射,然后轉(zhuǎn)換csv格式為實(shí)體對象 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"; //去掉頭部和尾部的多余信息,只顯示內(nèi)容 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實(shí)現(xiàn)CSV格式轉(zhuǎn)對象的詳細(xì)內(nèi)容,更多關(guān)于Java CSV轉(zhuǎn)對象的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java C++題解leetcode1620網(wǎng)絡(luò)信號最好的坐標(biāo)
這篇文章主要為大家介紹了Java C++題解leetcode1620網(wǎng)絡(luò)信號最好的坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Spring?Boot?Actuator管理日志的實(shí)現(xiàn)
本文主要介紹了Spring?Boot?Actuator管理日志的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07歸并算法之有序數(shù)組合并算法實(shí)現(xiàn)
這篇文章主要介紹了歸并算法之有序數(shù)組合并算法實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-07-07淺談Storm在zookeeper上的目錄結(jié)構(gòu)
這篇文章主要介紹了淺談Storm在zookeeper上的目錄結(jié)構(gòu)的相關(guān)內(nèi)容,涉及storm使用zookeeper的操作以及詳細(xì)結(jié)構(gòu)圖,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語句塊的使用方式
這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語句塊的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01java線程池ThreadPoolExecutor類使用小結(jié)
這篇文章主要介紹了java線程池ThreadPoolExecutor類使用,本文主要對ThreadPoolExecutor的使用方法進(jìn)行一個(gè)詳細(xì)的概述,示例代碼介紹了ThreadPoolExecutor的構(gòu)造函數(shù)的相關(guān)知識,感興趣的朋友一起看看吧2022-03-03