복붙노트

[SPRING] Spring Batch - 입력 csv 파일의 헤더 행을 검증하고 파일이 무효화되면 건너 뜁니다.

SPRING

Spring Batch - 입력 csv 파일의 헤더 행을 검증하고 파일이 무효화되면 건너 뜁니다.

나는 아래와 같이 간단한 일을한다.

<batch:step id="step">
 <batch:tasklet>
  <batch:chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" commit-    interval="5000" />
 </batch:tasklet>
</batch:step>

itemReader는 다음과 같습니다.

<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader"
scope="step">
 <property name="linesToSkip" value="1"></property>
 <property name="skippedLinesCallback" ref="skippedLinesCallback" ></property>

 <property name="lineMapper">
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                <property name="lineTokenizer" ref="lineTokenizer">                
                <property name="delimiter" value="," />                    
            </bean>
        </property>
        <property name="fieldSetMapper">
            <bean
                class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" />
        </property>
    </bean>
</property>
<property name="resource" value="#{stepExecutionContext['inputKeyName']}" />
</bean>

<bean id"lineTokenizer"                        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">

<bean id="skippedLinesCallback" class="com.test.IteMReaderHeader" >
<property name="lineTokenizer" ref="lineTokenizer">
</bean>

나는 "com.test.IteMReaderHeader"클래스에 "lineTokenizer"를 삽입하여 입력 필드의 "이름"을 설정합니다.

고정 헤더 값이있는 입력 csv 파일의 첫 번째 행 인 헤더 행의 유효성을 검사해야하며 헤더 행이 무효화되면 해당 단계에서 실패하고 전체 파일을 건너 뛰고 다음 파일이 될 수 있도록해야합니다. 읽기 위해 사용됩니다.

그것을 성취 할 수있는 적절한 방법을 제안하십시오. 나는 당신의 시간과 소중한 의견에 진심으로 감사 할 것입니다.

감사 !!

해결법

  1. ==============================

    1.FlatFileItemReader 파일 중지 조건을 찾는 코드가 관리됩니다.

    FlatFileItemReader 파일 중지 조건을 찾는 코드가 관리됩니다.

    IMHO 가장 좋은 해결책은 skippedLineCallback에서 런타임 예외를 throw하고 오류가 발생하여 리더가 고갈 상태가되는 것입니다.

    이런 식으로 당신의 대의원을 작성하는 적의 예

    class SkippableItemReader<T> implements ItemStreamReader<T> {
      private ItemStreamReader<T> flatFileItemReader;
      private boolean headerError = false;
    
      void open(ExecutionContext executionContext) throws ItemStreamException {
        try {
          flatFileItemReader.open(executionContext);
        } catch(MyCustomExceptionHeaderErrorException e) {
          headerError = true;
        }
      }
    
      public T read() {
        if(headerError)
          return null;
        return flatFileItemReader.read();
      }
    
      // Other functions delegation
    }
    

    (대리인을 직접 스트림으로 등록해야합니다.) FlatFileItemReader를 다음과 같이 확장

    class SkippableItemReader<T> extends FlatFileItemReader<T> {
      private boolean headerError = false;
    
      protected void doOpen() throws Exception {
        try {
          super.doOpen();
        } catch(MyCustomExceptionHeaderErrorException e) {
          headerError = true;
        }
      }
    
      protected T doRead() throws Exception {
        if(headerError)
          return null;
        return super.doRead();
      }    
    }
    

    코드는 테스트없이 직접 작성되었으므로 오류가있을 수 있지만 내 요점을 이해할 수 있기를 바랍니다. 희망은 당신의 문제를 해결할 수 있습니다.

  2. from https://stackoverflow.com/questions/18517983/spring-batch-validate-header-lines-in-input-csv-file-and-skip-the-file-if-it-i by cc-by-sa and MIT license