csv文件转list

java读取csv文件获取对应list

代码

package com.fool.util;

import cn.hutool.json.JSONUtil;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;

/**
 * csv文件读取
 *
 * @author walle
 * @date 2020/12/9 17:24
 **/
public class CsvRead {

    private List<String> header;
    private final List<String> content = new ArrayList<>();
    private String fieldSeparator = ",";
    private final Map<String, Integer> headerMap = new HashMap<>();
    private Charset charset = Charset.defaultCharset();
    
    public CsvRead() {}

    /**
     * 初始化 填入分隔符
     *
     * @param fieldSeparator 分隔符
     */
    public CsvRead(String fieldSeparator) {
        this.fieldSeparator = fieldSeparator;
    }

    /**
     * 初始化 分隔符 编码格式
     *
     * @param fieldSeparator 分隔符
     * @param charset        charset
     */
    public CsvRead(String fieldSeparator, Charset charset) {
        this.fieldSeparator = fieldSeparator;
        this.charset = charset;
    }

    /**
     * 读取csv文件返回 list<Map>
     *
     * @param sPath csvPath
     * @return list
     */
    public List<Map<String, String>> readMapList(String sPath) {
        read(sPath);
        List<Map<String, String>> result = new ArrayList<>();
        for (String line : content) {
            String[] vals = line.split(fieldSeparator);
            result.add(getContentMap(vals));
        }
        return result;
    }

    /**
     * 读取csv文件 返回list<Bean>
     *
     * @param sPath  csvPath
     * @param tClass clazz
     * @param <T>    T
     * @return list
     */
    public <T> List<T> read(String sPath, Class<T> tClass) {
        read(sPath);
        List<T> result = new ArrayList<>();
        for (String line : content) {
            String[] vals = line.split(fieldSeparator);
            result.add(getContentBean(vals, tClass));
        }
        return result;
    }

    /**
     * 行转bean
     *
     * @param vals   每行分割出的字符串数组
     * @param tClass t
     * @param <T>    T
     * @return T
     */
    private <T> T getContentBean(String[] vals, Class<T> tClass) {
        return JSONUtil.parse(getContentMap(vals)).toBean(tClass);
    }

    /**
     * 行转map
     *
     * @param vals 每行分割出的字符串数组
     * @return map
     */
    private Map<String, String> getContentMap(String[] vals) {
        Map<String, String> lineMap = new HashMap<>(vals.length);
        headerMap.forEach((key, value) -> lineMap.put(key, vals[value]));
        return lineMap;
    }

    /**
     * 读取首行 header
     */
    private void getHeaderMap() {
        for (int i = 0; i < header.size(); i++) {
            final String field = header.get(i);
            headerMap.put(field, i);
        }
    }


    private void read(String sPath) {
        try {
            BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(sPath), charset));
            String line;
            // 首行
            line = bf.readLine();
            header = Arrays.asList(line.split(fieldSeparator));
            while ((line = bf.readLine()) != null) {
                content.add(line);
            }
            getHeaderMap();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

使用方法

通过初始化 CsvRead 并调用对应读取方法

默认构造

    List<Test> list = new CsvRead().read("csvPath", Test.class);
    // 或者
    List<Map<String, String>> list = new CsvRead().readMapList("csvPath");

设置分隔符

    String fieldSeparator = "";
    List<Test> list = new CsvRead(fieldSeparator).read("csvPath", Test.class);
    // 或者
    List<Map<String, String>> list = new CsvRead(fieldSeparator).readMapList("csvPath");

设置分隔符和编码格式

    String fieldSeparator = "";
    Charset charset = Charset.forName("UTF-8");
    List<Test> list = new CsvRead(fieldSeparator, charset).read("csvPath", Test.class);
    // 或者
    List<Map<String, String>> list = new CsvRead(fieldSeparator, charset).readMapList("csvPath");

以上记录,留作自用。如有问题,欢迎指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值