【问题标题】:Manipulate CSV file using groovy and java使用 groovy 和 java 操作 CSV 文件
【发布时间】:2022-07-06 23:05:01
【问题描述】:

新手在这里有一个问题。我以以下 .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;

所以它的多行具有相同的设置。我想删除日期早于 06.07.2022 的每一行。所以理论上只有第一行应该仍然在 .csv 文件中,其他的应该被删除。

我希望能够将日期声明为变量。 我已经做了以下尝试来理解:

     private String dateii      = 'test.csv';                               // Filename Input
     private String dateio      = '';                                           // Filename Output


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) {                                     // Remove Empty rows
                    
                    
                }
            } 
        }
        

编辑:

所以我的问题如下:

  1. 如何删除整行?
  2. 如何使用日期指定要删除的行?

谢谢!

【问题讨论】:

  • 为什么标签中有 2 种语言 - java & groovy?哪一个将被接受为响应?
  • @daggett 你好!两者都被接受。两个都可以用,不知道哪个好用。我正在尝试使用比 Java 更多的 groovy
  • @Eritrean 您好,感谢您的帮助!我将问题编辑得更准确。我希望这能澄清一点。再次感谢您。

标签: java csv groovy


【解决方案1】:

这似乎是一个学校作业,所以我会简短并省略代码。

首先,将您的目标日期定义为LocalDate 对象。

LocalDate target = LocalDate.of( 2021 , 6 , 7 ) ;

您现有的代码中每一行都有一个字段列表。您的目标是通过比较第二个字段(日期)进行过滤。

  1. 提取第二个字段,日期输入。
  2. 将该日期输入解析为LocalDate。使用 DateTimeFormatter 对象进行解析,并使用您定义的格式模式。
  3. 使用LocalDate#isBefore比较日期。
  4. 如果满足您的条件,则将该行写入输出文件。如果未满足,请移至下一行,从输出文件中省略当前行。

Stack Overflow 上已经多次介绍了这方面的所有方面。搜索以了解更多信息。

提示:Java NIO.2。 Java 有处理文件的旧方法和新方法。使用新方法。

你问:

如何删除整行?

跳过它。不要将该行写入输出文件。

你问:

如何使用日期指定要删除的行?

将日期字段的文本解析为LocalDate。使用LocalDate 方法(例如isAfterisBefore)与您的目标日期进行比较。


顺便说一句,更好的命名将使您的代码更易于阅读和调试。 data 含糊不清。 bufferinaccurateHeader 应以小写字母 header 开头。


在实际工作中,我们不会直接解析 CSV 文件。我们将使用 Java 生态系统中可用的几个好的 CSV 解析库中的任何一个。示例:Apache Commons CSV

【讨论】:

    【解决方案2】:

    如果输入文件这么简单,常规代码可能看起来像这样 - 否则最好使用 csv 库

    //could be replaced with src = new File(source_file_name)
    def src = '''
    10;30.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;
    '''
    
    //could be replaced with dst = new File(target_file_name)
    def dst = System.out
    def now = new Date()
    
    dst.withWriter{writer->
        src.eachLine{line->
            def row = line.split(/;/)
            if( row.size()==3 ){
                if( Date.parse('dd.MM.yyyy', row[1]).getTime() > now.getTime() ) {
                    writer << line << '\n'
                }
            }
        }
    }
    

    【讨论】:

    • 两个严重缺陷的 Date 类在几年前被 JSR 310 中定义的现代 java.time 类所取代。
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多