使用opencsv从csv文件中删除引号

时间:2016-02-01 20:46:21

标签: groovy formatting opencsv

我正在尝试在csv文件中添加更改数据:

这是样本数据:

DATE        status       code                       value     value2
"2016-01-26","Subscription All","119432660","1315529431362550","0.0080099833517888"
"2016-01-26","Subscription All","119432664","5836995058433524","0.033825584764444"
"2016-01-26","Subscription All","119432664","8287300074499777","0.076913377834744"
"2016-01-26","Subscription All","119432664","14870697739968326","0.0074188355187426"

我的代码用于格式化数据:

    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)
    writer.writeAll(allRows)
    writer.close()

我得到的输出就是这个,添加额外的报价而不是删除它。

""2016-01-26"",""Subscription All"",""119432660"",""1315529431362550"",""0.0080099833517888""
""2016-01-26"",""Subscription All"",""119432664"",""5836995058433524"",""0.033825584764444""
""2016-01-26"",""Subscription All"",""119432664"",""8287300074499777"",""0.076913377834744""
""2016-01-26"",""Subscription All"",""119432664"",""14870697739968326"",""0.0074188355187426""

我想删除引号。 请有人帮忙。

另外,是否可以将日期格式更改为yyyymmdd而不是yyyy-mm-dd?

   allRows.each { String[] theLine ->
        String newDate = theLine[0].replaceAll('-', '')
        String newline = theLine.eachWithIndex { String s, int i -> return i > 0 ? s : newDate}
        writer.writeLine(newline)
    }

由于

3 个答案:

答案 0 :(得分:3)

当您实例化CSVReader时,您告诉它不要将任何字符视为引号,因此它会将现有引号作为数据读取并且不会删除它们。

当您告诉CSVWriter不添加任何引号时,它会尊重您的请求。但是,输入数据包含引号字符,并且在CSV中的字符串中包含引号的约定是 double 引号。就这样 字符串值

ABC"DEF

以CSV格式编码为

"ABC""DEF"

因此,您看到的结果是不删除输入上的引号(您告诉它不要)然后将输出上的引号加倍。

要解决此问题,请将输入选项从NULL_CHARACTER更改为DEFAULT_QUOTE_CHARACTER。但请注意,如果您的任何数据实际上包含嵌入的引号或逗号,则结果输出将不是有效的CSV。

另外我认为这可能是针对OpenCSV的有效错误报告。我相信OpenCSV需要通知你,当你告诉它忽略引号时,可能是通过运行时异常生成无效的CSV。虽然我认为他们可能会争辩说你选择在没有网络的情况下工作,并且应该接受你得到的任何东西。就个人而言,我选择了“最少惊喜的原则”,当输出没有引用时,恕我直言会不会加双引号。

答案 1 :(得分:2)

因为CSVReader中的引号设置为CSVParser.NULL_CHARACTER "被视为普通字符,它是读取令牌的一部分。这会导致您的数组包含以下格式的数据:

["2016-01-26", "Subscription All", "119432660", "1315529431362550", "0.0080099833517888"]

而不是:

[2016-01-26, Subscription All, 119432660, 1315529431362550, 0.0080099833517888]

因此,请尝试将选项从CSVParser.NULL_CHARACTER更改为

  • '"'
  • CSVParser.DEFAULT_QUOTE_CHARACTER(它还存储'"')。

答案 2 :(得分:0)

CsvToBean csvToBean = new CsvToBeanBuilder(new StringReader(csv))
                .withMappingStrategy(strategy)
                .withIgnoreLeadingWhiteSpace(true)
                .withSeparator(',')
                .withIgnoreEmptyLine(true)
                .withQuoteChar('\'')
                .withQuoteChar('"')
                .build();