使用groovy和java操作CSV文件

pdtvr36n  于 2022-11-01  发布在  Java
关注(0)|答案(3)|浏览(199)

新手在这里有一个问题。我有下面的.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.如何删除完整的行?
1.如何使用日期指定要删除的行?
谢谢你,谢谢你

tkqqtvp1

tkqqtvp11#

这似乎是一个家庭作业,所以我会很简短,并省略代码。
首先,将目标日期定义为LocalDate对象。

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

您现有的程式码每一列都有一个字段清单。您的目的是透过比较第二个字段(日期)来筛选。
1.提取第二个字段,输入日期。
1.将该日期输入解析为LocalDate。使用DateTimeFormatter对象进行解析,并使用您定义的格式模式。
1.使用LocalDate#isBefore比较日期。
1.如果符合条件,则将该行写入输出文件。如果不符合条件,则移到下一行,并从输出文件中忽略当前行。
堆栈溢出的所有方面都已经被讨论过很多次了。搜索以了解更多。
提示:Java NIO.2.java有处理文件的旧方法,也有新方法。使用新方法。
你问:
如何删除完整的行?
跳过它。不要将该行写入输出文件。
你问:
如何使用日期指定要删除的行?
将日期字段的文本解析为LocalDate。使用LocalDate方法(如isAfterisBefore)与目标日期进行比较。
顺便说一下,更好的命名将使您的代码更容易阅读和调试。data是模糊的。bufferinaccurateHeader应该以小写字母header开头。
在实际工作中,我们不会直接解析CSV文件,而是使用Java生态系统中的几个优秀的CSV解析库中的任何一个。例如:Apache Commons CSV

watbbzwu

watbbzwu2#

在Groovy中,如果输入文件如此简单,则代码可能如下所示-否则最好使用csv库

import java.time.LocalDate

//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 = LocalDate.now()

dst.withWriter{writer->
    src.eachLine{line->
        def row = line.split(/;/)
        if( row.size()==3 ){
            if( LocalDate.parse(row[1], 'dd.MM.yyyy').toEpochDay() > now.toEpochDay() ) {
                writer << line << '\n'
            }
        }
    }
}
nx7onnlm

nx7onnlm3#

给定包含以下行的输入文件projects/test.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;

以下Groovy脚本:

import java.time.format.DateTimeFormatter
import java.time.LocalDate

final FMT = DateTimeFormatter.ofPattern('dd.MM.yyyy')

def targetDate = LocalDate.parse('06.07.2022', FMT)

def test = new File('projects/test.csv')
def filtered = new File('projects/filtered.csv')
def filteredOutput = filtered.newPrintWriter()

test.filterLine(filteredOutput) { line ->
   def parts = line.split(';')
   def lineDate = LocalDate.parse(parts[1], FMT)
   lineDate >= targetDate
}

在文件projects/filtered.csv中生成以下输出:

10;06.07.2022;This is test;

这是你要找的吗?
它利用了惯用的Groovy代码快捷方式和现代的java.time日期操作类。

相关问题