使用SuperCSV处理具有NULL值的列

时间:2014-11-28 14:06:56

标签: java supercsv

有没有办法配置SuperCSV期望处理NULL值的方式?这有时被处理为:

,,

或作为:

,NULL,

或作为:

,null,

但我似乎无法找到配置SuperCSV如何处理这些内容的方法,尤其是对于数字列。

1 个答案:

答案 0 :(得分:4)

,,由Super 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);
        }
    }
}

将打印

true
false
false

您可以使用单元格处理器("NULL""null"的组合)来处理OptionalToken。为了使其更具可重用性,您可以定义自己的处理器,只需设置它即可。此处理器将检查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);
        }
    }
}

将打印

true
true
true

要处理数字列,您可以像使用Optional

一样将其链接在一起
new CustomOptional(new ParseInt())