关于处理大批量Csv数据的方法
读取CSV文件
使用csv去读取文件处理的时候会遇到要出里大批量数据,但是使用hutool提供的CsvUtil的工具类去读取文件的时候会发现,文件过大,读取的过程中gc回收过程 ,堆栈溢出报错,即使配置了jvm的参数也没有办法将csv文件中的数据一次性读取出来,并且就算读取出来了,处理的速度也不尽人意。
public static void testwash(){
CsvReader reader = CsvUtil.getReader();
CsvData read1 = reader.read(new File("test.csv"),Charset.forName("GBK"));
List<CsvRow> rows = read1.getRows();
List<CsvRow> newRows = new ArrayList<>();
for (int i = 1; i < rows.size(); i++) {
CsvRow row = rows.get(i);
String text= row.get(1);
if(StringUtils.isNotBlank(text)){
newRows.add(row);
}
}
CsvWriter writer = CsvUtil.getWriter(new File("test.csv"), Charset.defaultCharset(), true);
writer.write(newRows);
writer.flush();
writer.close();
}
使用最原始的方式读取CSV文件
使用文件输入输出流可以按行去读CSV文件中的数据,将文件中的数据按行读取出来,然后慢慢处理,这样就可以方便去处理数据了
public static void teshwash() {
String csvFile = "test-input.csv";
String line = "";
String csvSplitBy = ","; // 根据你的CSV格式,可能需要修改分隔符
String outputCsvFile = "test-out.csv";
try (BufferedReader br = new BufferedReader(new FileReader(csvFile));
BufferedWriter bw = new BufferedWriter(new FileWriter(outputCsvFile))) {
while ((line = br.readLine()) != null) {
String[] data = line.split(csvSplitBy);
// 处理data,例如打印每一列
if(data.length == 1){
continue;
}
String text =data[1];
if(text == null || text .trim().isEmpty() ){
continue;
}
bw.write(line);
bw.newLine();
}
bw.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
评论区