Java 使用SuperCSV处理具有空值的列

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

有没有一种方法可以配置SuperSV如何处理空值?这有时被处理为:

,,
或作为:

,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应该在下一版本中起作用: