将日期列更改为整数

时间:2016-01-19 23:01:30

标签: date csv groovy opencsv

我有一个大的csv文件,如下所示:

DATE        status       code                       value     value2
2014-12-13  Shipped 105732491-20091002165230    0.000803398 0.702892835
2014-12-14  Shipped 105732491-20091002165231    0.012925206 1.93748834
2014-12-15  Shipped 105732491-20091002165232    0.000191278 0.004772389
2014-12-16  Shipped 105732491-20091002165233    0.007493046 0.44883348
2014-12-17  Shipped 105732491-20091002165234    0.022015049 3.081006137
2014-12-18  Shipped 105732491-20091002165235    0.001894693 0.227268466
2014-12-19  Shipped 105732491-20091002165236    0.000312871 0.003113062
2014-12-20  Shipped 105732491-20091002165237    0.001754068 0.105016053
2014-12-21  Shipped 105732491-20091002165238    0.009773315 0.585910214
:
:

我需要做的是删除标题并将日期格式更改为整数yyyymmdd(例如,20141217)

我使用opencsv来读写文件。

有没有办法让我可以一次更改所有日期而无需逐一解析它们? 下面是我删除标题并创建新文件的代码:

void formatCsvFile(String fileToChange) throws Exception {
CSVReader reader = new CSVReader(new FileReader(new File(fileToChange)), CSVParser.DEFAULT_SEPARATOR, CSVParser.NULL_CHARACTER, CSVParser.NULL_CHARACTER, 1)
info "Read all rows at once"
List<String[]> allRows = reader.readAll();

CSVWriter writer = new CSVWriter(new FileWriter(fileToChange), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER)
info "Write all rows at once"
writer.writeAll(allRows)
writer.close()
}

请帮助一下吗?

由于

2 个答案:

答案 0 :(得分:2)

您不需要解析日期,但您需要处理文件中的每一行并转换要转换的每一行的数据。 Java / Groovy没有类似awk的东西,你可以将文件数据用作列,例如,文件中每行的前10个“列”(通常是字符)。 Java / Groovy只处理文件中的“行”数据,而不是“列”。

你可以尝试这样的事情:(在Groovy中)

View

编辑: 如果您的CSVReader类不是从File派生的,那么就不能在其上使用Groovy的eachLine方法。如果CSVReader类的readAll()方法确实返回一个String数组列表,那么上面的代码可以改为:

reader.eachLine { String theLine ->
    int idx = theLine.indexOf(' ')
    String oldDate = theLine.subString(0, idx)
    String newDate = oldDate.replaceAll('-', '')
    String newLine = newDate + theLine.subString(idx);
    writer.writeLine(newline);
}

答案 1 :(得分:1)

忽略第一行(标题):

List<String[]> allRows = reader.readAll()[1..-1];

并替换&#39; - &#39;在日期中,通过拆分每一行并编辑第一行:

allrows = allrows.collect{
    row -> row.split(',')[0].replace(',','') // the date
              + row.split(',')[1..-1]        // the rest
}

我不知道你的意思&#34;所有约会一次&#34;。对我来说只能迭代。