You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Java拆分大型CSV文件时如何为每个子文件写入表头

CSV拆分加表头功能调整方案

核心修改思路

要实现所有子文件都携带表头,只需要单独存储原文件的表头,每个新子文件打开后先写表头再写数据即可,具体逻辑:

  • 优先读取原文件第一行作为公共表头单独存储,不参与数据行计数
  • 每个子文件创建完成后,先写入表头再写入后续数据
  • 计数器仅统计数据行数量,达到指定的maxLines(即单文件数据行数上限)时触发文件切分

调整后完整代码

public static void splitCSV(final String fileName, 
                        final String extension, 
                        final int maxLines) {

    try (Scanner s = new Scanner(new FileReader(String.format("%s.%s", fileName, extension)))) {
        // 读取表头单独存储
        String header = s.hasNextLine() ? s.nextLine() : "";
        int file = 0;
        int dataCnt = 0; // 仅统计数据行,不含表头
        // 第一个子文件先写入表头
        BufferedWriter writer = new BufferedWriter(new FileWriter(String.format("%s_%d.%s", fileName, file, extension)));
        writer.write(header + System.lineSeparator());

        while (s.hasNextLine()) {
            String line = s.nextLine();
            writer.write(line + System.lineSeparator());
            // 数据行计数达到上限触发切分
            if (++dataCnt == maxLines && s.hasNextLine()) {
                writer.close();
                // 新建子文件先写表头再重置计数
                writer = new BufferedWriter(new FileWriter(String.format("%s_%d.%s", fileName, ++file, extension)));
                writer.write(header + System.lineSeparator());
                dataCnt = 0;
            }
        }
        writer.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

关键修改说明

  • 新增表头读取逻辑,程序启动后优先读取第一行存为公共表头
  • 将原代码的next方法替换为nextLine,避免CSV行内存在空格时出现读取截断问题
  • 每个新子文件创建后优先写入表头,再写入数据内容
  • 计数器仅统计数据行,保证每个子文件的数据行数严格等于设置的maxLines,加上表头总共有maxLines+1行,符合“单文件数据行数设为3则每个子文件为3行数据+1行表头”的要求
  • 增加空文件兼容逻辑,原文件无内容时不会抛出异常

内容的提问来源于stack exchange,提问作者Ram Pr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 23:30:04