2017-02-22 3 views
0

텍스트 파일이 있습니다. 파일의 각 행은 | '로 구분 된'n '개의 열을 갖는 레코드를 나타냅니다. (파이프) 문자. 열 값은 int, string, date, timestamp 등의 형식입니다. 빈 문자열과 공백도 열 값으로 사용할 수 있습니다.자바의 레코드 스키마를 확인하십시오.

데이터 값 유형의 유효성 검사와 유효성 검사가 필요하지 않습니다.

1234|xyz|abc|2016-04-08 11:12:40|234 
1235|efgh|abc|2016-04-09 11:25:40| 
1236|efghij| || 

검증 코드 : 5 열 각각의

샘플 유효한 기록

boolean valid = true; 
String line = buffReader.readLine(); 
String[] tokens = null; 
while (line != null){ 
    tokens = line.split("\\|"); 
    if ((tokens.length==4 || tokens.length==5) && countPipes(line)==4){ 

    } else { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 

private int countPipes(String line){ 
    int count = 0; 
    count = line.length() - line.replace("|", "").length(); 
    return count; 
} 

나는 코드가 더 나을 수 있다고 생각. 누군가이 코드를 개선 할 수있는 방법을 알 수 있습니까?

+0

열 값에 이스케이프 처리 된'|'을 허용합니까? 그렇다면 유효성 검사에서이를 처리해야합니다. – dpr

+0

@RealSkeptic 버그를 지적 해 주셔서 감사합니다. 나는 그것을 바로 잡았다. – Marco99

+0

@dpr 열 값에 "|" 물론. – Marco99

답변

1

글쎄, 당신은 단순히 네 있다는 것을 확인할 수 있습니다 라인의 파이프. 정확히 4 개의 파이프가있는 경우 5 개의 열이 있는데, 이는 비어있을 수 있습니다 (허용 할 수 있음).

while (line != null) { 
    if (countPipes(line) != 4) { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 

이제는 줄을 분할 할 필요가 전혀 없습니다.

분할에 대한 메모. 두 개의 매개 변수를 사용하여 split을 사용하고 음수를 사용하면 분할에는 빈 요소에 대한 항목도 포함됩니다. 여기 데모입니다 : 여기

public class Test { 

    public static void main(String[] args) throws IOException { 
     String line = "A|B|||"; 

     String[] zeroSplit = line.split("\\|"); 
     String[] negativeSplit = line.split("\\|",-1); 

     System.out.println("When split without parameter: " + zeroSplit.length); 
     System.out.println("When split with negative parameter: " + negativeSplit.length); 
    } 
} 

출력은 다음과 같습니다

When split without parameter: 2 
When split with negative parameter: 5

그래서이 경우에, 당신은 당신의 분할 정확히 길이 5의 것을 확인하고 동일한 결과를 얻을 수 있습니다.

while (line != null) { 
    if (line.split("\\|",-1).length != 5) { 
     valid = false; 
     break; 
    } 
    line = buffReader.readLine(); 
} 
0

우선 무엇보다 중요한 점은 비교 연산자 == 대신 = (할당 연산자)을 하나 사용하기 때문에 if 문에 심각한 오류가 발생했습니다 !! 코드 정리에 관한

: 그것은 단지 약간의 조정 그리고이이를 검증 아마 더 나은 방법이 있지만, 내 마음에 와서 제일 먼저입니다 :

boolean valid = true; 
String line = buffReader.readLine(); 
while (valid && (line != null)){ 
    String[] tokens = line.split("\\|"); 
    valid = !(tokens.length == 4 || tokens.length == 5); 
    line = buffReader.readLine(); 
} 
+0

평등의 결함을 지적 해 주셔서 감사합니다. 나는 그것을 바로 잡았다. – Marco99