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");
以上记录,留作自用。如有问题,欢迎指出。