2014-11-28 4 views
1

SuperCSV가 NULL 값을 처리하는 방법을 구성하는 방법이 있습니까?SuperCSV로 NULL 값을 가진 열을 처리하십시오

,, 

또는 같은 : 같은

,NULL, 

또는이 때때로로 처리됩니다

,null, 

을하지만 SuperCSV 처리 할 것으로 예상하는 방법을 구성 할 수있는 방법을 찾을 수 없습니다 특히 숫자 열의 경우

+0

루 ks는 빈칸과 같이 null 케이스가 다음 릴리즈에서 작동해야합니다. https://github.com/super-csv/super-csv/pull/84 –

답변

2

,,은 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 

당신이 셀 프로세서 (OptionalToken의 조합)를 사용하여뿐만 아니라 "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))); 
    } 

} 
Optional와 당신처럼 그런 다음

true 
true 
true 

숫자 열을 처리하기 위해 인쇄합니다이 프로세서

@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); 
     } 
    } 
} 

을 사용할 수 있습니다

, 당신은 단순히 그것을 함께 체인 수 있습니다

new CustomOptional(new ParseInt()) 
+0

이 답변을 주셔서 감사합니다.하지만이 버그는 세미 버그로 간주됩니다. NULL을 나타내는 유일한 수단으로 ,,를 사용하면 빈 문자열과 NULL 문자열의 차이로 인해 문제가 발생합니다. 많은 데이터베이스 내보내기 시스템은 특히 SuperCSV가 기본적으로 기대하는 유일한 방법으로 NULL을 나타내지 않습니다. 그들은 \ n 또는 NULL을 사용하여 NULL을 사용하므로 따옴표가 선택적 인 상황에서 널 문자열과 빈 문자열을 구분할 수 있습니다. – robross0606

+0

예, CSV 형식의 제한 사항입니다. 다른 형식 (예 : JSON, YAML, XML)은 해킹 가능 (이동 불가능) 해결 방법없이 null 문자열과 빈 문자열을 구별 할 수 있습니다. –

+0

이 솔루션은 또한 Bean 목록을 읽는 중 잘 작동하지 않는 것 같습니다. NULL이 아닌 여러 열이 있지만 String (Double, Integer 등) 이외의 다른 데이터 유형 인 경우 어떻게합니까? – robross0606

관련 문제