java - OpenCSV - CsvReaderNullFieldIndicator 似乎没有什么区别

标签 java csv opencsv

我正在使用opencsv创建 CsvToBean像这样:

CsvToBean<AccountBean> csvToBean = new CsvToBeanBuilder<AccountBean>(new InputStreamReader(inputStream))
                .withFieldAsNull(CSVReaderNullFieldIndicator.NEITHER)
                .withType(AccountBean.class)
                .build();

这是我的 AccountBean :

public class AccountBean extends BeanBase<Account>
{

    @CsvBindByName(column = "Id", required = true)
    public String salesforceId;

    @CsvBindByName(column = "OwnerId", required = true)
    public String ownerId;

    @CsvBindByName(column = "Name", required = true)
    public String name;

    // billing address
    @CsvBindByName(column = "BillingStreet")
    String billingStreet;
    @CsvBindByName(column = "BillingCity")
    String billingCity;
    @CsvBindByName(column = "BillingState")
    String billingState;
    @CsvBindByName(column = "BillingPostalCode")
    String billingPostcode;
    @CsvBindByName(column = "BillingCountry")
    String billingCountry;

}

问题在于地址字段 - 如果有空白字段,则它们始终为空,无论 CSVReaderNullFieldIndicator 是哪个我传递给 .withFieldAsNull() 的值.

我的 csv 文件有双引号来表示空字段,因此使用 CSVReaderNullFieldIndicator.NEITHER (无论如何都是默认值)应该生成一个空字符串。

这会导致问题,因为我将空值保存到数据存储区,然后又导致 NullPointerExceptions。

我做错了什么吗?

最佳答案

我正在尝试你的方法,并且我有同样的行为。由于这个库是开源的,我正在挖掘它发生的原因。

  • 内部CsvToBean类(class)你有一个CSVReader负责 访问要读取的数据。
  • 内部CSVReader您有一个 CSVParser,它负责获取单个字符串并根据分隔符、引号和转义字符将其解析为元素。
  • CSVParser包含 CSVReaderNullFieldIndicator 的成员(枚举)用于告诉 CSVParser什么可以视为 null。

当您在代码中调用 build() 时 CsvToBean , CSVReaderCSVParser根据您传递给 CsvToBeanBuilder 的信息进行实例化.

当您调用parse()CSVReader将遍历您的 CSV 文件,并为每一行调用 CSVParser 。根据您的分隔符,解析器将返回一个字符串值数组。此时,基于 NullFieldIndicator 的 CSVParser 会考虑将字符串保留为空或将其设置为 null。最后,如果您的 NullFieldIndicator 属性为 NEITHER例如,考虑的行是“one”;“”,则解析器返回的字符串数组将是 [one,""] 或 [one, null] if CSVReaderNullFieldIndicatorBOTHEMPTY_QUOTES .

在此阶段之后,解析的行将映射到 AccountBean字段。决定字段是否为空 StringUtils.isNotBlank()已使用。

结论:无论你传递给withFieldAsNull()什么,因为“”或null被认为是 false通过StringUtils.isNotBlank() ,因此该字段将为空。

您可以询问开发人员此行为是否是预期的行为。也许他有原因,或者只是一个错误。

关于java - OpenCSV - CsvReaderNullFieldIndicator 似乎没有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856200/

相关文章:

java - Spring JPA规范: searching for parameters in a parent class

java - Mockito:如何验证来自另一个单例类的单例类的方法调用

java - 当列的值为空时,getColumnCount 不计算该列吗?

php - str_getcsv 未正确解析数据

java - 更改 Android Eclipse 设置以忽略错误

python - 嵌套的 json 到 csv - 通用方法

java - 创建 CSV 并以 byte[] 形式返回,以便在 Spring Controller 中下载

java - opencsv,不能将值与“

java - 通过提取列值修改并生成新的csv文件

java - OpenCSV:将嵌套 Bean 映射到 CSV 文件