【问题标题】:skip double quotes when reading csv file using apache commons csv使用 apache commons csv 读取 csv 文件时跳过双引号
【发布时间】:2016-06-14 05:26:13
【问题描述】:
Reader in = new FileReader(dataFile);
Iterable<CSVRecord> records = CSVFormat.RFC4180.withFirstRecordAsHeader().withIgnoreEmptyLines(true).withTrim().parse(in);

        // Reads the data in csv file until last row is encountered
        for (CSVRecord record : records) {

            String column1= record.get("column1");

这里 csv 文件中的 column1 值类似于“1234557。所以当我阅读该列时,它会在开头使用引号获取。Apache commons csv 中有什么方法可以跳过这些。

来自 csv 文件的示例数据:"""0996108562","""204979956"

【问题讨论】:

  • 那个屏幕转储毫无意义。看起来像 Excel 的快照。您的代码没有读取该内容,那么您向我们展示dataFile 引用的文件的实际内容如何?以文本形式粘贴到问题中,不要插入图像。但是,它可能会包含类似"""0996108562","""204979956" 的内容,它们是两个 CSV 引用值,其中值的第一个字符是引号。 CSV 解析器不会删除这些,而且绝对不应该。这是将数字数据作为文本输入的 Excel 怪癖,与 CSV 无关。 自行删除,或不要在 Excel 中添加。

标签: java csv apache-commons-csv


【解决方案1】:

无法通过此 MCVE (Minimal, Complete, and Verifiable example) 使用 commons-csv-1.4.jar 进行复制:

String input = "column1,column2\r\n" +
               "1,Foo\r\n" +
               "\"2\",\"Bar\"\r\n";
CSVFormat csvFormat = CSVFormat.RFC4180.withFirstRecordAsHeader()
                                       .withIgnoreEmptyLines(true)
                                       .withTrim();
try (CSVParser records = csvFormat.parse(new StringReader(input))) {
    for (CSVRecord record : records) {
        String column1 = record.get("column1");
        String column2 = record.get("column2");
        System.out.println(column1 + ": "+ column2);
    }
}

输出:

1: Foo
2: Bar

"2""Bar" 周围的引号已被删除。

【讨论】:

  • 感谢您的帮助。但是我已经尝试了代码,但它不起作用。我已更新问题并上传了 csv 外观的示例图片。
  • 阅读时我不想要开头的额外引号。使用我现有的代码,它会读取带有该引号的值。
  • 因为值 明确地引用。 CSV 解析器将保留引号,应该如此,因为前导引号与 CSV 无关。如果删除引号,CSV 解析器就会出错。
  • 我可以通过写代码去掉引号。我只是想知道commons csv中是否有任何内置方法可以做到这一点。就像逃跑一样。
  • 那么,答案是否定的,因为它们不是由 CSV 添加的,而 CSV 按照设计的方式保留了它们,并且 commons-csv 正在正确实现 CSV 解析。
【解决方案2】:

如果我正确理解您的要求,您需要使用 Apache 的 StringEscapeUtils 中的unescapeCsv。正如文档所说:

如果值用双引号括起来,并且包含逗号、换行符>>或双引号,则引号被删除。

任何双引号转义字符(一对双引号)都不会转义为一个双引号。

如果值没有用双引号括起来,或者是并且不包含逗号、换行符或双引号,则返回 String 值不变。

【讨论】:

  • 您能否检查已编辑的问题。现在您将能够理解要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2015-09-24
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多