2014-11-19 5 views
3

탭 문자 작동하지 않습니다 :StringUtils.countMatches는()와 같은 나는 내용으로 CSV 파일의 유효성을 검사하고

TEST;F;12345;0X4321 - 1234 DUMMYTEXT;0X4321 - 1234 TESTTEXT

지금까지 값이로 구분 된 ';' 텍스트 공백 포함 할 수있는 동안은, 탭을 열 구분자로 중지 처리해야 할 지금,

private static final String COLUMN_SEPARATOR = ";"; 

public void validateFile(BufferedReader reader) { 

    String line = reader.readLine(); 

    while (line != null && result == ValidationResult.VALID) { 

     //this is broken with tab-stop as COLUMN_SEPARATOR   
     int matches = StringUtils.countMatches(line, COLUMN_SEPARATOR); 

     if (matches != getCSVColumnCount() - 1 
      && StringUtils.isNotBlank(line)) { 

      if (matches == 0) { 
       //MISSING_CSV_COLUMN_SEPERATOR; 
      } else { 
       //UNEXPECTED_CSV_COLUMN_COUNT; 
      }     
     } 
     line = reader.readLine(); 
    }  
} 

변경된 요구 사항으로 :와 방법은 마법처럼 일했다

TEST F 12345 0x4321 - 1234 DUMMYTEXT 0x4321 - 1234 TESTTEXT

내가 변경된 다음 줄 :

private static final String COLUMN_SEPARATOR = "\\t"; 

문제 :StringUtils.countMatches(line, "\\t")어떤 현상도 찾을 수 없습니다 (0을 반환합니다). 나는 싶지 않아 :

int matches = line.split("\\t").length; 

나는 그것이 상당한 성능 저하 (csv로 - 파일이 작은되지 않습니다) 될 것이라고 supersticious 나처럼

. 더 좋은 방법을 알고 있습니까?

+1

왜 두 개의 백 슬래시를 사용합니까? Tab은'\ t'입니다. –

+0

아참. 고맙습니다. 이제 작동합니다. –

답변

6

Java 문자열 의 백 슬래시를 이스케이프 처리했습니다. 결과 문자열은 백 슬래시와 't'의 두 문자로 구성됩니다.

자바 문자열 리터럴에서 표 문자를 나타내려면 \t을 사용하십시오 (단일 백 슬래시에 유의하십시오).

수정은 다음과 같습니다 예상대로

private static final String COLUMN_SEPARATOR = "\t"; 

그런 다음 StringUtils.countMatches()가 작동합니다.