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

使用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) {                                     // 移除空行
                    
                    
                }
            } 
        }

现有两个问题需要解决:

  1. 如何实现删除CSV文件中的整行数据?
  2. 如何基于日期判断逻辑筛选出需要删除的目标行?

解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:54:23