我之前从未使用过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:请检查字段数
谢谢。
这是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并对行进行标记。