Java如何读取本地CSV文件、删除指定列后覆盖原文件?
Java实现CSV指定列删除并覆盖原文件方案
当然可以高效实现,哪怕是百万行级的CSV文件,用流式逐行读写的方式内存占用能稳定控制在极低水平,不会出现内存溢出问题,普通小文件处理速度基本是毫秒级。
核心实现思路
- 全程不直接修改原文件,先写入同目录临时文件,所有内容处理完成校验无误后再替换原文件,避免程序中途崩溃、磁盘满等异常场景损坏原始数据
- 先读取第一行表头,定位需要删除的
LASTNAME列的索引位置,后续所有数据行统一跳过该索引对应的字段 - 采用流式逐行读写,不把整个文件全量加载到内存,大文件也能稳定运行
可直接运行的实现代码
以下代码用Java原生API实现,不需要引入任何第三方依赖,适配你给出的无特殊转义字符的CSV场景:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class CsvColumnRemover { public static void main(String[] args) throws IOException { // 替换为你的CSV文件实际本地路径 Path csvPath = Paths.get("D:/your-dir/your-file.csv"); String targetDeleteColumn = "LASTNAME"; // 同目录生成临时文件 Path tempPath = csvPath.resolveSibling(csvPath.getFileName() + ".tmp"); try ( BufferedReader reader = Files.newBufferedReader(csvPath); BufferedWriter writer = Files.newBufferedWriter(tempPath) ) { // 读取并处理表头 String headerLine = reader.readLine(); if (headerLine == null || headerLine.isBlank()) { throw new RuntimeException("CSV文件内容为空"); } List<String> headers = new ArrayList<>(Arrays.asList(headerLine.trim().split(","))); int deleteIndex = headers.indexOf(targetDeleteColumn); if (deleteIndex == -1) { throw new RuntimeException("文件中不存在需要删除的列:" + targetDeleteColumn); } // 写入处理后的表头 headers.remove(deleteIndex); writer.write(String.join(",", headers)); writer.newLine(); // 逐行处理数据 String dataLine; while ((dataLine = reader.readLine()) != null) { if (dataLine.isBlank()) continue; List<String> columns = new ArrayList<>(Arrays.asList(dataLine.trim().split(","))); columns.remove(deleteIndex); writer.write(String.join(",", columns)); writer.newLine(); } } // 处理完成后替换原文件 Files.delete(csvPath); Files.move(tempPath, csvPath); } }
补充说明
- 如果你处理的CSV存在字段内含逗号、换行、双引号转义的复杂格式,只需要把代码里
split(",")的原生拆分逻辑,替换为OpenCSV、Commons CSV这类成熟CSV解析库的逐行读取逻辑即可,整体流式处理的框架不需要改动,性能依然很高 - 如果文件编码不是UTF-8,在创建
BufferedReader和BufferedWriter时指定对应编码即可 - 针对你给出的样例数据,运行上述代码后输出的结果和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者ychaulagain
相关产品推荐
相关产品推荐

