侧边栏壁纸
博主头像
gale-blog博主等级

少年一贯快马扬帆,道阻且长不转弯,要盛大,要绚烂,要哗然,要用理想的泰坦尼克号去撞现实冰川,要当烧赤壁的风,而非借箭草船,要为了一片海,就肯翻万山

  • 累计撰写 39 篇文章
  • 累计创建 5 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

处理大批量Csv数据的方法

二月在这里
2024-06-14 / 0 评论 / 0 点赞 / 16 阅读 / 2317 字

关于处理大批量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();
        }
    }

0

评论区