[SPRING] FlatFileItemReader 및 청크를 사용하여 CSV에서 빈 줄을 건너 뛰는 방법
SPRINGFlatFileItemReader 및 청크를 사용하여 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.우리는 빈 줄을 건너 뛰도록 독자에게 알려주는 사용자 지정 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(); } }
from https://stackoverflow.com/questions/29673524/how-to-skip-blank-lines-in-csv-using-flatfileitemreader-and-chunks by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 대량 할당 문제를 해결하는 방법 : 불안정한 바인더 구성 (API Abuse, Structural) in java (0) | 2019.02.20 |
---|---|
[SPRING] Spring이 디버그 정보없이 매개 변수 이름을 얻는 방법 (0) | 2019.02.20 |
[SPRING] Spring Data Cassandra를 사용하여 java.util.Date 값을 Cassandra 날짜 유형 컬럼에 삽입하는 방법? (0) | 2019.02.19 |
[SPRING] 스프링 보안 원형 빈 의존성 (0) | 2019.02.19 |
[SPRING] 어떻게 Activiti JavaDelegate에서 스프링 빈에 액세스 할 수 있습니까? (0) | 2019.02.19 |