使用 SuperCSV 处理具有 NULL 值的列

rob*_*606 2 java supercsv

有没有办法配置 SuperCSV 期望如何处理 NULL 值?这有时被处理为:

,,
Run Code Online (Sandbox Code Playgroud)

或作为:

,NULL,
Run Code Online (Sandbox Code Playgroud)

或作为:

,null,
Run Code Online (Sandbox Code Playgroud)

但是我似乎找不到一种方法来配置 SuperCSV 期望如何处理这些,尤其是对于数字列。

Jam*_*ett 5

,,由 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

会打印

true
false
false
Run Code Online (Sandbox Code Playgroud)

你可以把它处理"NULL",并"null"通过使用Cell处理器的组合(以及OptionalToken)。为了使其更具可重用性,您可以定义自己的处理器,只需对其进行设置。该处理器将检查null, then "null", then"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)));
    }

}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这个处理器

@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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个会打印

true
true
true
Run Code Online (Sandbox Code Playgroud)

要处理数字列,您可以简单地将其链接在一起,就像使用Optional

new CustomOptional(new ParseInt())
Run Code Online (Sandbox Code Playgroud)