OpenCSV - CsvReaderNullFieldIndicator似乎没有区别



我正在使用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;
}

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

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

这会导致问题,因为我将空值保存到我的数据存储,然后稍后会导致空指针异常。

我做错了什么?

我正在尝试您的方法,我有相同的行为。由于这个库是开源的,我一直在挖掘它为什么会发生。

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

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

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

在此阶段之后,解析的行将映射到AccountBean字段。要确定该字段为空,请使用 StringUtils.isNotBlank()。

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

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

这需要一些思考,因为问题出在 BeanFieldPrimitiveType 类中,该类仅在有值时才设置一个值(因此空字段将导致空值)。 这是因为这是转换为所有类型的,并且大多数不处理空字符串(整数)。 因此,需要修改此类以检查字段的类型,如果它是一组特定的类型(现在是 String),则允许转换空值。

我在您在sourceforge中打开的错误中发布了上述内容,我们将尝试在openCSV的4.1或4.2中修复。

相关内容

  • 没有找到相关文章

最新更新