복붙노트

[SPRING] FlatFileItemReader 및 청크를 사용하여 CSV에서 빈 줄을 건너 뛰는 방법

SPRING

FlatFileItemReader 및 청크를 사용하여 CSV에서 빈 줄을 건너 뛰는 방법

FlatFileItemReader를 사용하여 CSV 파일을 처리하고 있습니다.

때로는 입력 파일 내에 빈 줄이 나타납니다.

그 일이 일어 났을 때 모든 걸음이 멈 춥니 다. 나는 그 라인을 건너 뛰고 정상적으로 진행하고 싶다.

나는 예외 처리기를 단계에 추가하려고 시도했다. 대신 전체 단계를 멈추지 않고 예외를 잡으려고했다.

@Bean
    public Step processSnidUploadedFileStep() {
        return stepBuilderFactory.get("processSnidFileStep")
                .<MyDTO, MyDTO>chunk(numOfProcessingChunksPerFile) 
                .reader(snidFileReader(OVERRIDDEN_BY_EXPRESSION))
                .processor(manualUploadAsyncItemProcessor())
                .writer(manualUploadAsyncItemWriter())
                .listener(logProcessListener)
                .throttleLimit(20)
                .taskExecutor(infrastructureConfigurationConfig.taskJobExecutor())
                .exceptionHandler((context, throwable) -> logger.error("Skipping record on file. cause="+ ((FlatFileParseException)throwable).getCause()))
                .build();
    }

빈 줄이 도착하고 예외가 잡히면 덩어리로 처리하기 때문에 전체 덩어리는 건너 뜁니다 (덩어리는 CSV 파일의 유효한 줄을 포함 할 수 있으며 건너 뛰어도됩니다)

파일을 청크로 처리 할 때이 작업을 어떻게 수행 할 수 있습니까?

감사, 레이.

내 코드를 편집 한 후. 여전히 건너 뛰지 않습니다.

public Step processSnidUploadedFileStep() {
        SimpleStepBuilder<MyDTO, MyDTO> builder = new SimpleStepBuilder<MyDTO, MyDTO>(stepBuilderFactory.get("processSnidFileStep"));
       return builder
                .<PushItemDTO, PushItemDTO>chunk(numOfProcessingChunksPerFile)
                .faultTolerant().skip(FlatFileParseException.class)
                .reader(snidFileReader(OVERRIDDEN_BY_EXPRESSION))
                .processor(manualUploadAsyncItemProcessor())
                .writer(manualUploadAsyncItemWriter())
                .listener(logProcessListener)
                .throttleLimit(20)
                .taskExecutor(infrastructureConfigurationConfig.taskJobExecutor())
                .build();
    }

해결법

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

    1.우리는 빈 줄을 건너 뛰도록 독자에게 알려주는 사용자 지정 SimpleRecordSeparatorPolicy를 만들었습니다. 그렇게하면 100 개의 레코드를 읽습니다. 즉 3은 빈 줄이며 예외없이 무시되며 97 개의 레코드를 씁니다.

    우리는 빈 줄을 건너 뛰도록 독자에게 알려주는 사용자 지정 SimpleRecordSeparatorPolicy를 만들었습니다. 그렇게하면 100 개의 레코드를 읽습니다. 즉 3은 빈 줄이며 예외없이 무시되며 97 개의 레코드를 씁니다.

    다음은 코드입니다.

    package com.my.package;
    
    import org.springframework.batch.item.file.separator.SimpleRecordSeparatorPolicy;
    
    public class BlankLineRecordSeparatorPolicy extends SimpleRecordSeparatorPolicy {
    
        @Override
        public boolean isEndOfRecord(final String line) {
            return line.trim().length() != 0 && super.isEndOfRecord(line);
        }
    
        @Override
        public String postProcess(final String record) {
            if (record == null || record.trim().length() == 0) {
                return null;
            }
            return super.postProcess(record);
        }
    
    }
    

    여기 독자가 있습니다.

    package com.my.package;
    
    import org.springframework.batch.core.configuration.annotation.StepScope;
    import org.springframework.batch.item.file.FlatFileItemReader;
    import org.springframework.batch.item.file.mapping.DefaultLineMapper;
    import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
    import org.springframework.stereotype.Component;
    
    @Component
    @StepScope
    public class CustomReader extends FlatFileItemReader<CustomClass> {
    
        @Override
        public void afterPropertiesSet() throws Exception {
            setLineMapper(new DefaultLineMapper<CustomClass>() {
                {
                    /// configuration of line mapper
                }
            });
            setRecordSeparatorPolicy(new BlankLineRecordSeparatorPolicy());
            super.afterPropertiesSet();
        }
    }
    
  2. from https://stackoverflow.com/questions/29673524/how-to-skip-blank-lines-in-csv-using-flatfileitemreader-and-chunks by cc-by-sa and MIT license