使用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
相关产品推荐
相关产品推荐

