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

mir*_*row 3 spring-batch

我正在实施基于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
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

然后在自定义中MultiLineCaseItemReader你可以做到read()peek()

Dea*_*ark 8

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

更具体地说,您可能希望扩展SingleItemPeekableItemReaderFlatFileItemReader用作您的代理.

你要peek()进入下一个项目.如果它是你的一部分current item,很棒,继续并增加你的项目.如果它是下一个"标题"行,那么你已经完成了你正在工作的项目并且可以返回current item.

然后,下一个read()将从你刚看到的那一行开始,而不会丢失你在文件中的位置或搞乱可重启性.