2013-12-10 3 views
1

나는 supercsv 라이브러리를 발견 했으므로 매우 훌륭한 작업 같아 보인다. 그러나 나는 여기 웹 사이트에 제공된 문서로 대답 할 수 없다는 의문을 가지고 있습니다.여러 열에 의존하는 SuperCSV Cellprocessor

기본적으로 다른 열이 특정 값으로 설정된 경우에만 나타나는 열이있는 csv 파일이 있습니다.

없음

(12)/01/1999

없음

예 (11)/05/1985

IsBirthDate, 생년월일

예 : 그래서 예를 들어 다음과 같은 일 것

아니요

내가보기에 평균.

없음을 12/09/1968

건배

+0

CSV 파일에는 실제로 제공 한 예와 같이 변수 열이 있습니까? 아니면 각 행 뒤에','이 오나요? –

+0

그렇지 않습니다. 그래서 "아니오"행은 실제로 "아니오"입니다. 또한 저수준에서 많은 예외 처리를해야하고 파일이 파싱되지 않는 이유에 대한 세부적인 보고서를 사용자 정의하여 제공해야하므로 csv 파일을 구문 분석하는 데 필요한 클래스를 수동으로 작성하기로 결정했습니다. 라이브러리 supercsv는 여전히 멋지게 보입니다. –

답변

1

이처럼 보인다 : 계정에이 종속성을 가지고이 같은 행이 발견되면 예외를 던질 수있는 cellprocessor을 만들 수있는 방법이 있나요 이미 슈퍼 CSV 포럼에 대답하고있다 : http://sourceforge.net/p/supercsv/feature-requests/25/#30a5

경우 링크의 게시물을 복사하는 것은 아래로 간다 :

난 당신을 생각 아이템에 parentPartNumber가 있는지 확인하고 제품에 대한 유효성 검사를 건너 뛸 수 있는지 묻는 중입니다. 이것은 입니다. 본질적으로 교차 유효성 검사 (유효성 검사는 1보다 많습니다. 열).

셀을 사용하여이 작업을 수행하는 유일한 방법은 다른 셀에 값을 검사하고 값에 따라 수행 할 작업을 결정하는 사용자 지정 셀 프로세서를 작성하는 것입니다. 모든 셀 프로세서는 CsvContext에 액세스 할 수 있으며 여기에는 원시 (처리되지 않음) 값이 포함됩니다.

따라서 과 같은 프로세서를 작성할 수 있습니다. 지정된 열 (열 번호가 1에서 시작하는 값)의 값이 예상 값과 같으면 Optional처럼 작동합니다. 그렇지 않으면 단순히 체인의 다음 프로세서로 위임합니다.

package example; 

import java.util.List; 

import org.supercsv.cellprocessor.Optional; 
import org.supercsv.cellprocessor.ift.CellProcessor; 
import org.supercsv.util.CsvContext; 

public class OptionalIfOtherColumnEquals extends Optional { 

    private final int column; 

    private final Object constantValue; 

    public OptionalIfOtherColumnEquals(int column, 
            Object constantValue) { 
    super(); 
    this.column = column; 
    this.constantValue = constantValue; 
    } 

    public OptionalIfOtherColumnEquals(int column, 
            Object constantValue, 
            CellProcessor next) { 
    super(next); 
    this.column = column; 
    this.constantValue = constantValue; 
    } 

    @Override 
    public Object execute(Object value, CsvContext context) { 

    // unprocessed row 
    List<Object> row = context.getRowSource(); 

    // optional if other column matches value 
    if (row.get(column - 1).equals(constantValue)){ 
     return super.execute(value, context); 
    } 

    // otherwise continue to next processor 
    return next.execute(value, context); 
    } 

} 
나는 새로운 OptionalIfOtherColumnEquals (2, "제품"새로운 IsValueIn (partNumbers))하고 제품 및 항목에 대한 작업과 parentPartNumber 열 의 프로세서 정의를 대체하지만 검증 실패 파일 끝에있는 패키지.

당신이 해결할 연습으로 을 남겨 두겠습니다. 그러나 실제로해야한다면 은 교차 유효성 검사를 할 수 있습니다. 희망이 도움이됩니다.