多行记录读取器(当开始前缀=结束前缀时) [英] Multi-Line Records Reader (when start prefix = end prefix)

查看:15
本文介绍了多行记录读取器(当开始前缀=结束前缀时)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在实施基于https://docs.spring.io/spring-batch/reference/html/patterns.html#multiLineRecords的多行记录阅读器解决方案

我有以下平面文件:

HEA;0013100345;2007-02-15
NCU;Smith;Peter;;T;20014539;F
BAD;;Oak Street 31/A;;Small Town;00235;IL;US
HEA;0013100345;2007-02-15
NCU;Smith;Peter;;T;20014539;F
HEA;0013100345;2007-02-15

HEA(也可以选择NCU、BAD)必须转换为单个对象。
然而,在我的例子中,我没有"结束"行,所以"HEA"是新项目的开始,同时也是前一个项目的结束。

感谢迪恩·克拉克下面的好建议。这是解决方案的Java配置:

@Bean
public FlatFileItemReader<FieldSet> readerFlat() {
    FlatFileItemReader<FieldSet> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("multirecord.txt"));
    reader.setLineMapper(compositeLineMapper());
    return reader;
}

@Bean
public SingleItemPeekableItemReader<FieldSet> readerPeek() {
    SingleItemPeekableItemReader<FieldSet> reader = new SingleItemPeekableItemReader<FieldSet>() {{
        setDelegate(readerFlat());
    }};
    return reader;
}

@Bean
public MultiLineCaseItemReader readerMultirecord() {
    MultiLineCaseItemReader multiReader = new MultiLineCaseItemReader() {{
        setDelegate(readerPeek());
    }};
    return multiReader;
}

然后在自定义MultiLineCaseItemReader中,您可以同时执行read()peek()

推荐答案

正如参考文档中提到的,您应该创建ItemReader的自定义实现来包装FlatFileItemReader

更具体地说,您可能希望扩展SingleItemPeekableItemReader并使用FlatFileItemReader作为您的委派。

您将peek()前进到下一项。如果它是您的current item的一部分,很好,请继续增加您的项目。如果是下一个"Header"行,则您已经完成了正在处理的项目,可以返回current item

然后,下一个read()将从您刚才窥视的行开始,不会丢失您在文件中的位置,也不会影响可重启。

这篇关于多行记录读取器(当开始前缀=结束前缀时)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆