fastCSV实现上传CSV文件

实现上传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;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值