【问题标题】:How to differentiate between empty string and null with OpenCSV如何使用 OpenCSV 区分空字符串和 null
【发布时间】:2014-08-14 06:42:37
【问题描述】:

这是我的代码:

CSVReader reader = new CSVReader(isReader);
while ((col = reader.readNext()) != null) {
   String c1 = col[1];
}

这是我的 csv 文件:

"a","","c"
"1",,"3"

有没有办法区分 null 和 ""? OpenCSV 似乎将所有内容都视为非空字符串。我可以告诉它将空字段视为 null 吗?

【问题讨论】:

    标签: java null opencsv


    【解决方案1】:

    添加到@Gavriel 的答案,从 OpenCSV 3.6(可能更早)开始,我发现 strictQuotes 不再有助于返回 null。

    CSVReaderBuilder 有 withFieldAsNull() 用于此目的。

    CSVReader csvReader = new CSVReaderBuilder(csvFileReader)
        .withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
        .build();
    

    【讨论】:

    • 我相信这一定是正确的答案,因为大多数阅读器构造函数都已弃用。顺便说一句,指标也有 BOTH 选项,它认为空分隔符和空引号都为空。
    • 只有在 CSVParserBuilder 上设置“withFieldAsNull”时才对我有用,而不是在 CSVReaderBuilder 上,首先创建 CSVParserBuilder ,然后像这样创建 CSVReaderBuilder - CSVReaderBuilder(new CSVParserBuilder(...)) - (打开 csv 5.0)
    【解决方案2】:

    这是不可能的。在CSV 格式的理念中,空字符串和特定于java 的null 之间没有区别。 nulljava 对象内存模型中的空引用。在 CSV 中没有任何引用,只有空值。

    【讨论】:

    • 有。在上面的 csv 示例中,我希望 opencsv 能够注意到 , 和 ,"", 之间的区别。我可以默认将所有内容都转换为非空字符串,但我希望有一个可选参数,我可以在其中覆盖默认行为并让 opencsv 知道,每当它看到某个字符串时,它应该将其视为 NULL。但为了让它工作,它必须在解析器内部(我不能扩展 opencsv 来添加这个恕我直言),因为在我得到的数据级别中,它已经转换为“”
    • @Gavriel,按照CSV的格式,,,,"",是同一个东西。
    • 那个标准在哪里?我以为还没有 csv RFC
    • 我没有看到任何关于空字段的信息。
    【解决方案3】:

    打开 csv 5.0

    CSVParser csvParser = new CSVParserBuilder()
                            .withSeparator(",")
                            .withQuoteChar('"')
                            .withFieldAsNull(CSVReaderNullFieldIndicator.BOTH)
                            .build();
    
                    csvReader = new CSVReaderBuilder(new InputStreamReader(...))
                            .withCSVParser(csvParser)
                            .build();
    

    【讨论】:

      【解决方案4】:

      我找到了解决方案:strictQuotes 可用于获取空值:

      CSVReader reader = new CSVReader(isReader, ',', '"', true);
      while ((col = reader.readNext()) != null) {
         String c1 = col[1];
         if (null != c1) {
             // ...
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2020-01-31
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2011-06-15
        • 2018-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多