最近在公司写项目时,有个读取/修改csv格式文件数据的需求。
Java读取csv文件时默认是按照 ,
[英文逗号]分割的,如果数据内容不包含逗号直接整行读取即可,但内容包含了,
[英文逗号] 读取的并不是我想要的内容
经过研究找到hutool工具下CsvUtil 可以用,操作如下
依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
代码 demo
CsvReader reader = CsvUtil.getReader();
//读取方式1
CsvData data = reader.read(FileUtil.file("test.csv"));
//读取方式2
CsvData data = reader.read(new InputStreamReader(inputStream, CharsetUtil.UTF_8));
//读取方式3 转为对象数据
List<Bean> data = reader.read(ResourceUtil.getUtf8Reader("bean.csv"), Bean.class)
csv整行数据包括表头
List<CsvRow> rows = data.getRows();
for (CsvRow csvRow : rows) {
//修改index=修改数据下标 value改的内容
csvRow.set(index,value);
//读取 整行数据
List<String> columnList = csvRow.getRawList();
}
//单列数据
for (CsvRow csvRow : rows) {
csvRow.get(rowNum)
}
个人封装方法
-
基于csv列返回对应对象数据
public static <T> List<T> getFromZipTable(Sring file, String fileName, Class<T> clazz)
throws Exception {
List<T> result = reader.read(ResourceUtil.getUtf8Reader(file), clazz);
inputStream.close();
return CollectionUtils.isNotEmpty(result) ? result : new ArrayList<>(0);
}
-
获取指定文件列内容
/**
* 获取指定文件列内容
*/
public static List<String> getColumnValueFromZip(InputStream inputStream, String fileName, String columnName)
throws Exception {
List<String> columnValue = new ArrayList<>();
try {
//从文件中读取CSV数据
CsvReader reader = CsvUtil.getReader();
CsvData data = reader.read(new InputStreamReader(inputStream, CharsetUtil.UTF_8));
List<CsvRow> rows = data.getRows();
//获条件索引
int rowNum = -1;
CsvRow headers = rows.get(0);
for (int i = 0; i < headers.size(); i++) {
if (headers.get(i).toString().equals(columnName)) {
rowNum = i;
break;
}
}
if (rowNum == -1) {
return columnValue;
}
//遍历行
boolean headerFlag = true;
for (CsvRow csvRow : rows) {
//跳过表头
if (headerFlag) {
headerFlag = false;
continue;
}
columnValue.add(csvRow.get(rowNum));
}
} finally {
inputStream.close();
}
return columnValue;
}