项目场景:
项目描述:读取.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);
}