Spring批处理错误的TokenCount异常读取器接受csv文件中的多列

问题描述 投票:0回答:1

我之前从未使用过Spring Batch,我有一个csv文件,我需要读取具有特定模型的所有列,但我有很多例外。

csv文件有8个字段。如果所有五个字段都存在,则文件处理效果很好。但如果错误的话,如果没有输入8个字段,如下所示:

c1; c2; C3; C4; C5; C6; C7; C8 // IT工作c1; C3; C7 //不工作:程序崩溃

错误是:由以下原因引起:org.springframework.batch.item.file.transform.IncorrectTokenCountException:记录中找到的令牌数量不正确:预期3实际8。

我的代码:

@Bean
public Step Step2(StepBuilderFactory stepBuilders) throws IOException {
    System.out.println("cecStep2");
    return stepBuilders.get("fileReject")
            .<CSCivique, String>chunk(100)
            .reader(reader())
            .processor(processor2FileReject())
            .writer(writer2())
            .build();
}

@Bean
public FlatFileItemReader<CSCivique> reader() throws IOException{

    try {


    return new FlatFileItemReaderBuilder<CSCivique>().name("personItemReader")
                                .resource(new ClassPathResource(confFile ()))
                                .delimited()
                                .delimiter(";")
                                .names(new String[] { "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8" })
                                .targetType(CSCivique.class)
                                .strict(false)
                                .build();

    }catch(Exception e) {
        System.out.println("----------- Exception reader() --------------");
        return null ;
    }


}

我想保存文件拒绝中的行,如:c1; C3; C7:请检查字段数

谢谢。

csv spring-batch
1个回答
0
投票

这是here记录的正常行为。您将阅读器配置为期望8列:

.names(new String[] { "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8" })

因此,任何具有不同数量的令牌的行都将被拒绝。

您可以做的是使用容错步骤并跳过以下行:

@Bean
public Step Step2(StepBuilderFactory stepBuilders) throws IOException {
    System.out.println("cecStep2");
    return stepBuilders.get("fileReject")
            .<CSCivique, String>chunk(100)
            .reader(reader())
            .processor(processor2FileReject())
            .writer(writer2())
            .faultTolerant()
            .skip(FlatFileParseException.class)
            .skipLimit(10)
            .build();
}

使用此配置,将跳过这些行,您的作业不会失败。之后您可以使用StepExecution#getSkipCount获取跳过计数。

否则,您可以根据需要创建自己的LineTokenizer并对行进行标记。

© www.soinside.com 2019 - 2024. All rights reserved.