最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)CSV格式轉(zhuǎn)對(duì)象

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

介紹

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

我找了找目前百度上基本是沒有這方面的快捷轉(zhuǎn)換方式和工具包,能找到的基本都不能通用寫死的,沒辦法只能自己寫一份出來,主要用到的技術(shù),反射,泛型,類型轉(zhuǎn)換,構(gòu)造者設(shè)計(jì)模式 ,以下代碼給提供一個(gè)思路,技術(shù)差不多的話基本上看了下面的代碼是能自己寫出來的,如果是入門級(jí)別的Java程序員就自行跳過本博客

參考代碼

部分工具類的代碼沒有展示, 這里就粘貼主要核心原理,很簡(jiǎn)單,自己也是能編寫出來的

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中使用Closeable接口自動(dòng)關(guān)閉資源詳解

    Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解

    這篇文章主要介紹了Java中使用Closeable接口自動(dòng)關(guān)閉資源詳解,Closeable接口繼承于AutoCloseable,主要的作用就是自動(dòng)的關(guān)閉資源,其中close()方法是關(guān)閉流并且釋放與其相關(guān)的任何方法,如果流已被關(guān)閉,那么調(diào)用此方法沒有效果,需要的朋友可以參考下
    2023-12-12
  • SpringBoot測(cè)試類注入Bean失敗的原因及分析

    SpringBoot測(cè)試類注入Bean失敗的原因及分析

    SpringBoot 2.2版本前后測(cè)試類有所變化,2.2版本之后使用JUnit 5,導(dǎo)入注解@SpringBootTest和@Test來自junit.jupiter.api包;而2.2版本之前使用JUnit 4,需要額外導(dǎo)入@RunWith注解來自junit.runner包,無論哪個(gè)版本,都需確保測(cè)試類和啟動(dòng)類的包名一致
    2024-09-09
  • 解決@RequestBody部分屬性丟失的問題

    解決@RequestBody部分屬性丟失的問題

    這篇文章主要介紹了解決@RequestBody部分屬性丟失的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java中的key接口解析

    java中的key接口解析

    這篇文章主要介紹了java中的key接口,有需要的朋友可以參考一下
    2014-01-01
  • Java校驗(yàn)銀行卡是否正確的核心代碼

    Java校驗(yàn)銀行卡是否正確的核心代碼

    這篇文章主要介紹了Java校驗(yàn)銀行卡是否正確的核心代碼,需要的朋友可以參考下
    2017-01-01
  • springboot整合log4j的踩坑實(shí)戰(zhàn)記錄

    springboot整合log4j的踩坑實(shí)戰(zhàn)記錄

    log日志的重要性不言而喻,所以我們需要在系統(tǒng)內(nèi)根據(jù)實(shí)際的業(yè)務(wù)進(jìn)行日志的整合,下面這篇文章主要給大家介紹了關(guān)于springboot整合log4j的踩坑實(shí)戰(zhàn)記錄,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • java背包問題動(dòng)態(tài)規(guī)劃算法分析

    java背包問題動(dòng)態(tài)規(guī)劃算法分析

    這篇文章主要介紹了java背包問題動(dòng)態(tài)規(guī)劃算法分析,想了解算法的同學(xué)一定要看一下
    2021-04-04
  • Java線程之ThreadLocal解析

    Java線程之ThreadLocal解析

    這篇文章主要介紹了Java線程之ThreadLocal解析,ThreadLocal 提供線程的局部變量,每個(gè)線程都可以通過get()和set()對(duì)局部變量進(jìn)行操作而不會(huì)對(duì)其他線程的局部變量產(chǎn)生影響,實(shí)現(xiàn)了線程之間的數(shù)據(jù)隔離,需要的朋友可以參考下
    2023-09-09
  • 詳解Java字符串在內(nèi)存中的存儲(chǔ)位置

    詳解Java字符串在內(nèi)存中的存儲(chǔ)位置

    這篇文章主要介紹了Java字符串在內(nèi)存中的存儲(chǔ)位置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • idea兩側(cè)的maven-project-structure圖標(biāo)不見了如何解決

    idea兩側(cè)的maven-project-structure圖標(biāo)不見了如何解決

    這篇文章主要介紹了如何解決idea兩側(cè)的maven-project-structure圖標(biāo)不見了問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評(píng)論

阿拉善右旗| 赤城县| 孟村| 芜湖县| 固阳县| 松溪县| 鹤庆县| 葵青区| 阳城县| 青田县| 阳朔县| 丽水市| 友谊县| 凌海市| 河西区| 平山县| 溧水县| 介休市| 辛集市| 海宁市| 安达市| 天镇县| 阿图什市| 海盐县| 广平县| 札达县| 靖边县| 乌鲁木齐市| 大同县| 岐山县| 三原县| 临清市| 永定县| 资讯 | 兰考县| 天全县| 于都县| 酉阳| 象山县| 嘉黎县| 宜兴市|