2015-04-16 40 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(); 
    } 
}