Date 将日期列更改为整数

Date 将日期列更改为整数,date,csv,groovy,opencsv,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

我有一个大的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()
}
void formatCsvFile(字符串fileToChange)引发异常{
CSVReader reader=new CSVReader(new FileReader(new File(fileToChange)),CSVParser.DEFAULT_分隔符,CSVParser.NULL_字符,CSVParser.NULL_字符,1)
信息“一次读取所有行”
List allRows=reader.readAll();
CSVWriter writer=新CSVWriter(新文件编写器(fileToChange),CSVWriter.DEFAULT\u分隔符,CSVWriter.NO\u QUOTE\u字符)
信息“一次写入所有行”
writer.writeAll(所有行)
writer.close()
}
请找个人帮忙好吗

谢谢

忽略第一行(标题):

我不知道你说的“一次约会”是什么意思。对于我,只能进行迭代。

忽略第一行(标题):


我不知道你说的“一次约会”是什么意思。对我来说,只能进行迭代。

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

您可以尝试以下内容:(在Groovy中)

编辑: 如果您的CSVReader类不是从文件派生的,那么就不能对其使用Groovy的eachLine方法。如果CSVReader类的readAll()方法真的返回字符串数组列表,那么上面的代码可能会更改为:

allRows.each { String[] theLine ->
    String newDate = theLine[0].replaceAll('-', '')
    writer.writeLine(newDate + theLine[1..-1])
}

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

您可以尝试以下内容:(在Groovy中)

编辑: 如果您的CSVReader类不是从文件派生的,那么就不能对其使用Groovy的eachLine方法。如果CSVReader类的readAll()方法真的返回字符串数组列表,那么上面的代码可能会更改为:

allRows.each { String[] theLine ->
    String newDate = theLine[0].replaceAll('-', '')
    writer.writeLine(newDate + theLine[1..-1])
}


正则表达式替换似乎是此任务最合适的工具不要使用正则表达式。。。有Date.parse()和.formatOr,只是一个简单的
字符串.replace()
。正则表达式替换似乎是最适合此任务的工具不要使用正则表达式。。。这里有Date.parse()和.formatOr,只是一个简单的
字符串.replace()
。嗨,我得到了这个错误:error:null;消息:没有方法签名:[Ljava.lang.String;.split()适用于参数类型:(java.lang.String)值:[,]可能的解决方案:split(groovy.lang.Closure),wait(),sort(),tail(),toList(),wait(long)??有什么原因吗?行的格式是什么?您能在运行代码的地方执行它吗?[“a,c”,“b,d”]。收集{row->row.split(',')}。如果是这样的话,row.split应该可以工作,因为它是一个Ljava.lang.String.hi,我得到了以下错误:错误:null;消息:没有方法签名:[Ljava.lang.String;.split()适用于参数类型:(java.lang.String)值:[,]可能的解决方案:split(groovy.lang.Closure),wait(),sort(),tail(),toList(),wait(long)?有什么原因吗?行的格式是什么?你能在运行代码的地方执行吗?[“a,c”,“b,d”]。收集{row->row.split(',')}。如果是这样的话,row.split应该可以工作,因为它是一个Ljava.lang.String.Hi..我在更改的行中得到了括号..为什么?错误:null;消息:没有方法签名:au.com.bytecode.opencsv.CSVWriter.writeLine()适用于参数类型:(java.lang.String)值:[20141108,[Shipped,105732491-20091002165230,0.000803398,0.702892835]]错误说明了两件事。首先,将字符串数组传递给需要字符串arg的方法,然后,表示CSV中每个更改行的字符串数组只有2项,插槽0中的新日期和“原始数组的其余部分”在插槽1中。看起来您需要展开“原始数组的其余部分”,并将每个字段分别写入新行。请尝试
String newline=newDate+theLine.each{return it}
,然后将
newline
传递给编写器。5分钟后编辑到上面:尝试
String newline=theLine.eachwhithindex{String s,int i->return i>0?s:newDate}
更改了代码:allRows.each{String[]theLine->String newDate=theLine[0]。replaceAll('-','')String newline=theLine.eachwhithindex{String s,int i->return i>0?s:newDate writer.writeLine(newline)}获取一个空白文件..有什么帮助吗?感谢Groovy通常情况下,闭包的返回要么是闭包中的最后一个赋值,要么是显式返回值(如果已赋值)。我猜Groovy的“收集方法”采用闭包参数(如“eachWithIndex”)具有不同的“返回值”语义。如果您的“空白文件”是“完全空”的纠正措施将遵循一条路径,如果“空白文件”是“数百行空行”,则纠正措施将遵循另一条路径。基本上可以尝试:将“换行”分配移动到“每一行”结束和“构建”中“使用
+=
Hi.一次一行字段。我在更改的行中得到了括号。原因是??错误:null;消息:没有方法签名:au.com.bytecode.opencsv.CSVWriter.writeLine()适用于参数类型:(java.lang.String)值:[20141108,[105732491-20091002165230,0.000803398,0.702892835]]这个错误说明了两件事
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);
}
allRows.each { String[] theLine ->
    String newDate = theLine[0].replaceAll('-', '')
    writer.writeLine(newDate + theLine[1..-1])
}