【问题标题】:Remove quotes from csv file using opencsv使用 opencsv 从 csv 文件中删除引号
【发布时间】:2016-05-10 11:05:16
【问题描述】:

我正在尝试在 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)
    }

谢谢

【问题讨论】:

  • 好像不是bug,csv reader读取qoute字符作为字符串的一部分,writer将其作为值的一部分输出,而且esca[es作为double qoute.在这里查看更多信息:stackoverflow.com/questions/13969254/…
  • 我会 +1,但似乎当天没有票...叹息!

标签: groovy formatting opencsv


【解决方案1】:
CsvToBean csvToBean = new CsvToBeanBuilder(new StringReader(csv))
                .withMappingStrategy(strategy)
                .withIgnoreLeadingWhiteSpace(true)
                .withSeparator(',')
                .withIgnoreEmptyLine(true)
                .withQuoteChar('\'')
                .withQuoteChar('"')
                .build();

【讨论】:

    【解决方案2】:

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

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

    ABC"DEF
    

    在 CSV 中编码为

    "ABC""DEF"
    

    所以你看到的结果是不删除输入引号(你告诉它不要)然后加倍输出引号的组合。

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

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

    【讨论】:

    • 这有效..我复制了拼写错误的 DEFAULT_QUOTE_CHAACTER.. 哈哈
    • 感谢您的帮助。可以看看我的日期格式有什么问题吗?
    • 把它放在一个新问题中没有任何 CSV 内容。
    【解决方案3】:

    因为 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(它还存储'"')。

    【讨论】:

    • 感谢您的帮助。可以看看我的日期格式有什么问题吗?
    • @user175084 您可能正在寻找:allRows.forEach(row -&gt; row[0] = row[0].replace("-", ""));
    猜你喜欢
    • 2014-05-05
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 2013-02-28
    • 2022-01-20
    • 2017-02-14
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多