Java實(shí)現(xiàn)CSV格式轉(zhuǎn)對(duì)象
介紹
csv全稱“Comma-Separated Values”,是一種逗號(hào)分隔值格式的文件,是一種用來(lái)存儲(chǔ)數(shù)據(jù)的純文本格式文件。CSV文件由任意數(shù)目的記錄組成,記錄間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其它字符或字符串。
我找了找目前百度上基本是沒(méi)有這方面的快捷轉(zhuǎn)換方式和工具包,能找到的基本都不能通用寫死的,沒(méi)辦法只能自己寫一份出來(lái),主要用到的技術(shù),反射,泛型,類型轉(zhuǎn)換,構(gòu)造者設(shè)計(jì)模式 ,以下代碼給提供一個(gè)思路,技術(shù)差不多的話基本上看了下面的代碼是能自己寫出來(lái)的,如果是入門級(jí)別的Java程序員就自行跳過(guò)本博客
參考代碼
部分工具類的代碼沒(méi)有展示, 這里就粘貼主要核心原理,很簡(jiǎn)單,自己也是能編寫出來(lái)的
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)對(duì)象
* @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) {
//特殊符號(hào)的處理
this.separator = PatternCommon.division(separator);
this.objects=objects;
}
//列,映射,轉(zhuǎn)換的時(shí)候會(huì)和映射的順序保持一致 ,默認(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;
}
}測(cè)試用例
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)對(duì)象測(cè)試
*
* @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");
//讀取頭部對(duì)應(yīng)字段
String head = ReadAndWriteFileCSV.readFirstLineOne(absoluteFileOrDirPathAndCreateNewFile);
//去掉頭部和尾部的多余信息,只顯示內(nèi)容
List<String> list = ReadAndWriteFileCSV.readSkipHeadAndEnd(absoluteFileOrDirPathAndCreateNewFile);
//做映射,然后轉(zhuǎn)換csv格式為實(shí)體對(duì)象
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");
//手動(dòng)指定文件頭部
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)對(duì)象的詳細(xì)內(nèi)容,更多關(guān)于Java CSV轉(zhuǎn)對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java C++題解leetcode1620網(wǎng)絡(luò)信號(hào)最好的坐標(biāo)
這篇文章主要為大家介紹了Java C++題解leetcode1620網(wǎng)絡(luò)信號(hào)最好的坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Spring?Boot?Actuator管理日志的實(shí)現(xiàn)
本文主要介紹了Spring?Boot?Actuator管理日志的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(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-10
Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式
這篇文章主要介紹了Java程序的初始化順序,static{}靜態(tài)代碼塊和實(shí)例語(yǔ)句塊的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
java線程池ThreadPoolExecutor類使用小結(jié)
這篇文章主要介紹了java線程池ThreadPoolExecutor類使用,本文主要對(duì)ThreadPoolExecutor的使用方法進(jìn)行一個(gè)詳細(xì)的概述,示例代碼介紹了ThreadPoolExecutor的構(gòu)造函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-03-03

