【问题标题】:How to skip blank lines in CSV using FlatFileItemReader and chunks如何使用 FlatFileItemReader 和块跳过 CSV 中的空白行
【发布时间】:2015-04-16 11:36:34
【问题描述】:

我正在使用 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();
    }

由于我正在处理 chunks 当空白行到达并捕获异常时发生的情况是整个块被 跳过(该块可能包含 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();
    }

【问题讨论】:

    标签: spring csv spring-batch spring-batch-admin


    【解决方案1】:

    我们创建了自定义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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多