实现上传CSV文件的工具有很多,下面直接上代码
首先是添加依赖:
<dependency>
<groupId>de.siegmar</groupId>
<artifactId>fastcsv</artifactId>
<version>1.0.3</version>
</dependency>
然后是实现类,这里使用fastCSV有几种种方法可以读取文件:
第一种:
public static List<ResultInfo> csvReadOperation() throws IOException {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String dateString = formatter.format(currentTime);
System.out.println("startTime:"+dateString);
File file = new File("/Users/xxx/Desktop/testCSVReader.csv");
CsvReader csvReader = new CsvReader();
csvReader.setContainsHeader(true); //表示文件包含表头
List<ResultInfo> listResultInfo = new ArrayList<>();
CsvContainer csv = csvReader.read(file, StandardCharsets.UTF_8);
for (CsvRow row : csv.getRows()) {
if (row.getOriginalLineNumber() != 1) { //同样是为了去掉表头
ResultInfo resultInfo = new ResultInfo();
resultInfo.setUserId(row.getField(0));
resultInfo.setUserPhone(row.getField(1));
resultInfo.setUserName(row.getField(2));
resultInfo.setRegistTime(row.getField(3));
resultInfo.setUserlevel(row.getField(4));
resultInfo.setAppName(row.getField(5));
listResultInfo.add(resultInfo);
}
}
return listResultInfo;
}
第二种:有时候文件中包含空行,如果想跳过空行,需要设置属性
public static List<ResultInfo> csvReadOperation1() throws IOException {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String dateString = formatter.format(currentTime);
System.out.println("startTime:"+dateString);
File file = new File("/Users/fengyanjie/Desktop/test1CSVReader.csv");
CsvReader csvReader = new CsvReader();
csvReader.setContainsHeader(true);
csvReader.setSkipEmptyRows(true);//设置跳过空行
CsvContainer csv = csvReader.read(file, StandardCharsets.UTF_8);
List<ResultInfo> listResultInfo = new ArrayList<>();
System.out.println("文件list大小:"+csv.getRows().size());
for (CsvRow row : csv.getRows()) {
if (row.getOriginalLineNumber() != 1 && "" !=row.getFields().get(0)) {
ResultInfo resultInfo = new ResultInfo();
resultInfo.setUserId(row.getField(0));
resultInfo.setUserPhone(row.getField(1));
resultInfo.setUserName(row.getField(2));
resultInfo.setRegistTime(row.getField(3));
resultInfo.setUserlevel(row.getField(4));
resultInfo.setAppName(row.getField(5));
listResultInfo.add(resultInfo);
}
}
return listResultInfo;
}
上述方法会跳过空行,但是有一个坑,就是当你的CSV文件使用WPS进行删除修改后,即使行中没有数据,但是实际上行并不为空,如下:
表中共有六行,有效数据四行,按理讲应该有两行是空行,但是其CSV文件中并不是这样,使用文本编辑器打开CSV文件,如图:
CSV文件中我们可以看到其实是有六行,而且六行中并没有空行,所以这里的坑就是不要使用WPS修改CSV文件,这样会导致 csvReader.setSkipEmptyRows(true);方法失效,使用文本编辑器编辑后:
运行程序,结果如图:
这样就会跳过空行,只读取有效数据。
第三种:
public static List<ResultInfo> csvReadOperation2() throws IOException {
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String dateString = formatter.format(currentTime);
System.out.println("startTime:"+dateString);
File file = new File("/Users/fengyanjie/Desktop/test1CSVReader.csv");
CsvReader csvReader = new CsvReader();
List<ResultInfo> listResultInfo = new ArrayList<>();
try (CsvParser csvParser = csvReader.parse(file, StandardCharsets.UTF_8)) {
CsvRow row;
while ((row = csvParser.nextRow()) != null) {
ResultInfo resultInfo = new ResultInfo();
resultInfo.setUserId(row.getField(0));
resultInfo.setUserPhone(row.getField(1));
resultInfo.setUserName(row.getField(2));
resultInfo.setRegistTime(row.getField(3));
resultInfo.setUserlevel(row.getField(4));
resultInfo.setAppName(row.getField(5));
listResultInfo.add(resultInfo);
}
}
return listResultInfo ;
}
main方法
public static void main(String[] args) {
try {
List<ResultInfo> res = csvReadOperation1();
Date currentTime = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
String dateString = formatter.format(currentTime);
System.out.println("endTime:"+dateString);
System.out.println("list size:"+res.size());
}catch (Exception e){
e.printStackTrace();
}
}
实体类
public class ResultInfo {
private String UserId;
private String UserPhone;
private String UserName;
public String getUserId() {
return UserId;
}
public void setUserId(String userId) {
UserId = userId;
}
public String getUserPhone() {
return UserPhone;
}
public void setUserPhone(String userPhone) {
UserPhone = userPhone;
}
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getRegistTime() {
return RegistTime;
}
public void setRegistTime(String registTime) {
RegistTime = registTime;
}
public String getUserlevel() {
return Userlevel;
}
public void setUserlevel(String userlevel) {
Userlevel = userlevel;
}
public String getAppName() {
return AppName;
}
public void setAppName(String appName) {
AppName = appName;
}
private String RegistTime;
private String Userlevel;
private String AppName;
}