使用Groovy/Java操作CSV:按指定日期过滤删除数据行
问题背景
我是开发新手,现有如下结构的示例CSV文件:
10;06.07.2022;This is test; 08;01.07.2020;This is test; 15;06.07.2021;This is test; 09;06.07.2021;This is test;
该CSV所有行格式统一,需求是删除日期早于06.07.2022的所有行,理想处理结果为仅保留第一行,其余行全部移除,且日期阈值需支持声明为变量自定义配置。
目前我已编写部分基础读写代码尝试实现需求,代码如下:
private String dateii = 'test.csv'; // 输入文件路径 private String dateio = ''; // 输出文件路径 void openInputfile() { File outputfile = new File(dateio); outputfile.write(''); File inputfile = new File(dateii); if (!inputfile.exists()) { println("No File") } List data = inputfile.readLines(); for (String zeile in data) { if (zeile.startsWith('BEREICH')) { Header = zeile; } else { List buffer = zeile.split(";"); if (zeile.size() > 0) { // 移除空行 } } }
现有两个问题需要解决:
- 如何实现删除CSV文件中的整行数据?
- 如何基于日期判断逻辑筛选出需要删除的目标行?
解决方案
1. CSV整行删除的实现逻辑
不需要在原文件上做逐行删除操作,这种方式效率低还容易损坏原文件,通用做法是读入原文件所有行 -> 按规则过滤保留符合要求的行 -> 将保留的行全量写入新文件(或覆盖原文件)。你现有代码已经搭好了读写的基础框架,只需要在遍历行的时候把符合条件的行收集起来,最后统一写入输出文件即可。
2. 日期筛选逻辑实现
你的CSV里日期格式是dd.MM.yyyy,直接做字符串比较会出错(日月年格式下字符串序和实际时间序不匹配的场景会完全失效),正确做法是先把日期字符串解析成日期类型,再和你配置的阈值日期做比较。
完整可运行修改后代码
import java.text.SimpleDateFormat import java.util.Date private String dateii = 'test.csv'; // 输入文件路径 private String dateio = 'test_filtered.csv'; // 输出文件路径 // 自定义日期阈值,可自行修改 private String thresholdDateStr = "06.07.2022" // 匹配CSV内的日期格式 private SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy") void openInputfile() { // 提前解析阈值日期,全流程只需要解析一次 Date thresholdDate = sdf.parse(thresholdDateStr) // 存储符合保留要求的行 List<String> keepLines = new ArrayList<>() File inputfile = new File(dateii); if (!inputfile.exists()) { println("输入文件不存在") return } List<String> data = inputfile.readLines(); for (String zeile in data) { // 空行直接跳过 if (zeile.trim().isEmpty()) { continue } // 表头行直接保留,不做日期判断 if (zeile.startsWith('BEREICH')) { keepLines.add(zeile) continue } List<String> buffer = zeile.split(";"); // 校验列数,避免格式错误的行触发报错 if (buffer.size() >=2) { String dateStr = buffer[1].trim() try { Date rowDate = sdf.parse(dateStr) // 仅保留日期大于等于阈值的行,早于阈值的行直接跳过不收集 if (!rowDate.before(thresholdDate)) { keepLines.add(zeile) } } catch (Exception e) { println("行日期格式错误,跳过该行:" + zeile) } } } // 所有保留行写入输出文件 File outputfile = new File(dateio); outputfile.write(keepLines.join(System.lineSeparator())) }
关键说明
- 日期解析统一用
SimpleDateFormat匹配CSV内的dd.MM.yyyy格式,彻底避免字符串比较的逻辑错误 - 阈值日期抽为全局变量
thresholdDateStr,修改该值即可自定义筛选的时间节点 - 增加空行跳过、格式错误行捕获的容错逻辑,避免单行格式异常导致整个任务崩溃
- 处理结果统一写入输出文件,不会修改原输入文件,避免原始数据丢失
内容的提问来源于stack exchange,提问作者Gusdl
相关产品推荐
相关产品推荐

