2016-04-27 33 views
2

我基于https://docs.spring.io/spring-batch/reference/html/patterns.html#multiLineRecords多行记录阅读器(在启动时PREFIX =结束前缀)

我有以下的平面文件实现多行记录读卡器解决方案:

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()

回答

3

由于参考文档提到,你应该创建的ItemReader自定义实现包装的FlatFileItemReader

更具体地说,您可能需要扩展SingleItemPeekableItemReader并使用FlatFileItemReader作为您的代表。

你会peek()提前到下一个项目。如果它是你的current item的一部分,很好,继续并增加你的物品。如果它是下一个“标题”行,那么你已经完成了你正在工作的项目并且可以返回current item

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

+0

谢谢Dean!这正是我所期待的。想知道,为什么春季批参考指南与SingleItemPeekableItemReader没有任何关系...... – mirrow

+1

院长,你会好好修改这句话:“如果它是下一个”标题“行,那么你正在工作的项目。因为这听起来像一些词是错过:) – anton1980