多行记录读取器(当开始前缀 = 结束前缀时)



我正在实现基于 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"同时是新项目的开始和前一个项目的结束。

感谢Dean Clark在下面的好建议。这是解决方案的 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的一部分,那就太好了,请继续增加您的项目。如果是下一个"标题"行,则您已完成正在处理的项目,可以返回current item

然后,下一个read()将从您刚刚偷看的行开始,而不会丢失您在文件中的位置或弄乱可重启性。

相关内容

  • 没有找到相关文章

最新更新