Spring Batch FlatFileItemReader继续使用不正确的令牌数

时间:2018-02-20 22:32:26

标签: java spring csv spring-batch

我正在使用Spring Batch FlatFileItemReader来解析csv文件。我不时地得到一个格式不合理的行,应用程序完全崩溃:

Caused by: org.springframework.batch.item.file.transform.IncorrectTokenCountException: Incorrect number of tokens found in record: expected 11 actual 18

有没有办法告诉FlatFileItemReader继续(抛出异常并继续或忽略并继续)而不完全退出应用程序。

我猜我可能需要扩展FlatFileItemReader来实现这一点,因为似乎没有任何设置。关于如何最好地进行并实现这一目标的任何建议?

4 个答案:

答案 0 :(得分:3)

您可以为批处理作业配置SkipLogic 这是link to doc

基本上,如果您使用Java Config来管理批处理作业 你可以做这样的事情

stepBuilderFactory.get("step1")
                .<Person, Person>chunk(10)
                .reader(reader)
                .writer(writer)
                .processor(processor)
                .faultTolerant()
                .skipLimit(10)
                .skip(RuntimeException.class)
                .listener(skipListener) // if you want to add
                .build();

答案 1 :(得分:2)

我能够通过创建一个扩展注入DefaultLineMapper的{​​{1}}的类来解决这个问题。

然后我像这样覆盖mapLine方法:

FlatFileItemReader

答案 2 :(得分:0)

我不确定这是否与您的问题相同,但在解析包含引号字符的插入符”^“分隔文件时遇到了同样的错误。

字符旨在用于跨行结尾扩展字段或包含包含分隔符的字符串。所以我的行看起来像这样:

^3500 LCF Gas:  109" Wheelbase, Reg Cab^Chevrolet^3500 LCF Gas^109" Wheelbase, Reg Cab^L

将被解析为只有2个字段:

  1. 3500 LCF气体:109“轴距,Reg Cab ^雪佛兰^ 3500 LCF气体^ 109”轴距,Reg Cab
  2. 我真正想要的是5个领域:

    1. 3500 LCF气体:109“轴距,Reg Cab
    2. 雪佛兰
    3. 3500 LCF Gas
    4. 109“轴距,Reg Cab
    5. 我的文件中没有任何&符号,因此我将DelimitedLinetokenizer默认quoteCharacter从更改为&amp;

      lineTokenizer.setQuoteCharacter('&');
      

      修复了使用Spring Batch时导致相同错误的问题。

答案 3 :(得分:0)

我设法通过将strict中属性“ lineTokenizer”的属性“ DefaultLineMapper”设置为 false 来解决此问题。