.csv文件读取,和批量递归插入crateDB

该博客讲述了在Java项目中读取CSV文件并批量入库的过程。作者遇到了在不同项目中加载commons-csv库的问题,因此改用opencsv库。通过读取文件,处理数据,然后将数据存储到CrateDB数据库。由于数据量大,采用了分页策略,使用java8的stream.skip()和limit()方法实现。博客还展示了递归插入数据的代码,确保所有数据都能入库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

项目描述:读取.csv文件,并批量入库

问题描述:

提示:文件读取时,遇到问题1:用了org.apache.commons的commons-csv,不知道为啥一个项目可以加载jar包,另外一个项目死活找不到包。无奈换了opencsv,只需要添加依赖即可。


过程:读取👉👉数据处理👉👉批量入库
public  void readCsvFile(){
        try {
            File file = new File("E:\\2019.csv");
            ArrayList<List<String>> csvList = new ArrayList<List<String>>();
            CsvReader reader = new CsvReader();
            CsvContainer csvFile = reader.read(file, Charset.forName("UTF-8"));
            if (csvFile !=null) {
                    for(CsvRow row : csvFile.getRows()){
                        List<String> list = new ArrayList<>();
                        list.add(row.getField(0)); //按行读取,并把每一行的数据添加到list集合
                        list.add(row.getField(1)); //按行读取,并把每一行的数据添加到list集合
                        list.add(row.getField(2)); //按行读取,并把每一行的数据添加到list集合
                        csvList.add(list);
                    }
            }
            List<CrateDbEnergy> data = new ArrayList<>();
            for(int row=0;row<csvList.size();row++){
            	//根据自己的需求处理数据
                CrateDbEnergy result = new CrateDbEnergy();
                StringBuffer buffer = new StringBuffer();
                display_name = csvList.get(row).get(0);
                did_id = String.valueOf(new Date().getTime()*1000*1000);
                String test = csvList.get(row).get(2).split("/",3)[2];
                result = getResult(list,csvList.get(row).get(0),csvList.get(row).get(1),String.valueOf(buffer));
                //数据处理完毕,接下来这行把数据存入data中
                data.add(result);
            }
            if(data.size()>0){
                //批量递归插入crateDB
                add(data,0,1000);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }



入库crateDB:

分析:因为csv表中数据超过3W条,入库时报错
解决:java8 stream .skip() .limit() 实现分页功能
注意:①递归一定要有一个结束条件; ②:利用自身调用完成数据读取,在读取过程中插入数据库

//批量递归插入crateDB
    @PostMapping(value="/add")
    public void add (List<CrateDbEnergy> all,long strart,long limit){
    
        //截取 从strart开始截取 截取limit条
        List<CrateDbEnergy> collect = all.stream().skip(strart).limit(limit).collect(Collectors.toList());
        
        //递归结束条件
        if(collect.isEmpty()){
            return;
        }
        
        //批量插入数据的方法
        Map<String, Object> map = new HashMap<>();
        map.put("crateDbList",collect);
        map.put("tableName","energy.t_energy_item_data_10108");
        mqService.addBatchCrateDbEnergy(map);
        
        //调用自己
        add(all,strart+limit,limit);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值