我正在实施基于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()
答案 0 :(得分:6)
正如参考文档所述,您应该创建ItemReader
的自定义实现来包装FlatFileItemReader
。
更具体地说,您可能希望扩展SingleItemPeekableItemReader
并使用FlatFileItemReader
作为您的代表。
你peek()
提前到下一个项目。如果它是您current item
的一部分,那么,请继续并增加您的项目。如果它是下一个&#34;标题&#34;行,然后您已完成了您正在工作的项目,并且可以返回current item
。
然后,下一个read()
将从你刚看到的那一行开始,而不会丢失你在文件中的位置或搞乱可重启性。