Java 使用SuperCSV处理具有空值的列
有没有一种方法可以配置SuperSV如何处理空值?这有时被处理为:Java 使用SuperCSV处理具有空值的列,java,supercsv,Java,Supercsv,有没有一种方法可以配置SuperSV如何处理空值?这有时被处理为: ,, 或作为: ,NULL, ,null, 或作为: ,NULL, ,null, 但我似乎找不到一种方法来配置SuperCSV希望如何处理这些,特别是对于数字列。,由超级CSV自动处理。例如: @Test public void testNullsWithDefaultBehaviour() throws IOException{ String csv = ",null,NULL\n"; try (IC
,,
或作为:
,NULL,
,null,
或作为:
,NULL,
,null,
但我似乎找不到一种方法来配置SuperCSV希望如何处理这些,特别是对于数字列。
,
由超级CSV自动处理。例如:
@Test
public void testNullsWithDefaultBehaviour() throws IOException{
String csv = ",null,NULL\n";
try (ICsvListReader reader = new CsvListReader(new StringReader(csv),
CsvPreference.STANDARD_PREFERENCE)){
List<String> values = reader.read();
for (String v : values){
System.out.println(v == null);
}
}
}
您还可以使用单元处理器(可选的和令牌的组合)使其处理“NULL”
和“NULL”
。为了使它更具可重用性,您可以定义自己的处理器,只需对其进行设置。此处理器将检查null
,然后检查“null”
,然后检查“null”
,如果发现匹配,则返回null
,否则返回值不变
public class CustomOptional extends Optional {
public CustomOptional(){
super(new Token("null", null, new Token("NULL", null)));
}
public CustomOptional(final CellProcessor next) {
super(new Token("null", null, new Token("NULL", null, next)));
}
}
然后可以使用该处理器
@Test
public void testNullsUsingProcessors() throws IOException{
String csv = ",null,NULL\n";
CellProcessor[] processors = {new CustomOptional(),
new CustomOptional(),
new CustomOptional()};
try (ICsvListReader reader = new CsvListReader(new StringReader(csv),
CsvPreference.STANDARD_PREFERENCE)){
List<Object> values = reader.read(processors);
for (Object v : values){
System.out.println(v == null);
}
}
}
要处理数字列,只需像使用Optional
一样将其链接在一起:
new CustomOptional(new ParseInt())
我很欣赏这个答案,但我认为这是一个半错误。由于空字符串和空字符串之间的差异,使用、作为表示NULL的唯一方法是有问题的。许多数据库导出系统并不以默认情况下SuperSV所期望的唯一方式表示NULL。它们使用\N或NULL表示NULL,因此在引号是可选的情况下,您可以区分NULL字符串和空字符串。是的,CSV格式肯定有限制。大多数其他格式(如JSON、YAML、XML)都可以区分空字符串和空字符串,而无需任何繁琐的(不可移植的)解决方案。当我读入Bean而不是列表时,这种解决方案似乎也不起作用。如果有多个列的值为NULL,但它们是字符串以外的其他数据类型(Double、Integer等),您该怎么办?Define“似乎工作不正常”
(您应该得到一个有意义的异常)。如果字段是双精度的,则使用new CustomOptional(new ParseDouble())
,如果是整数,则使用new CustomOptional(new ParseInt())
,依此类推。您需要为字段类型使用正确的处理器。请参见示例。我成功地实现了这一点,尽管与上面描述的不完全一样。我上面提到的问题实际上是由于使用了支持注释的SuperCSV扩展。这本身不是一个超级SV问题,尽管我仍然认为推荐的解决方案在超级SV中非常笨拙。SuperCSV应该允许您指定它期望NULL的表示方式,而不是让您创建自定义链接处理器。看起来空列as NULL case应该在下一版本中起作用: