2015-04-16 81 views
2

我正在使用FlatFileItemReader處理CSV文件。如何使用FlatFileItemReader和塊跳過CSV中的空行

有時我在輸入文件中出現空行。

發生這種情況時,整個步驟停止。我想跳過這些線並繼續正常。

我試圖異常處理程序添加步驟,以趕上,而不必彎腰整個步驟execption:

@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文件行,並且也跳過)

任何想法如何做到這一點權利whe n以塊的形式處理文件?

謝謝, 射線。

編輯我的代碼後。仍然沒有跳繩:

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(); 
    } 

回答

4

我們創建的自定義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(); 
    } 
}