我有一个大的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()
}
请帮助一下吗?
由于
答案 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;。对我来说只能迭代。