我有一个文件来解析和处理记录.它可以逐行工作(一次解析一条记录).我的要求是我要通过多行解析并从每个记录中获取所需的信息,然后在组合所有记录中的获取信息后,我调用服务来执行业务逻辑.我必须在我的Processor类中执行此逻辑.数据如下例所示:
001 123456 987654321551580 Wayne DR 1
001 123456 987654321552APT 786 1
001 123456 987654321553洛杉矶1
001 123456 987654321554CA 1
001 123456 98765432155590001 1
第30-32列的数据元素是我有兴趣从每条记录中获取的数据元素.在上面的例子中,每行中的值分别为551,552,553,554,555.他们都在文件中一起进来.所以基本上当我的处理器中的当前项解析第一行并发现它的'551'(在业务代码中表示地址行1)时,我想要获取该行后面的其余地址并将它们保存在一个完整的行中地址.最后,我想从处理器将此地址传递给服务类,然后继续解析文件中可用的下一条记录.我的问题是处理器逐行为每条记录工作,所以这样我就无法在所有这些相关的行之间保持跟踪/关联.对不起,如果我无法以更简单的方式解释我的问题..我是Spring Batch的新手并且还在学习.
如果您知道关联的数据记录将在文件中彼此相邻(而不是随机展开),则可以利用SingleItemPeekableItemReader关联多行来创建一个完整的对象.这个较旧的答案有更多的信息.
示例上下文文件:
<bean id="peekingReader" class="com.package.whatever.YourPeekingReader">
<property name="delegate" ref="flatFileItemReader"/>
</bean>
<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="file://temp/file.txt" />
<property name="lineMapper">
<bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer" ref="yourTokenizer"/>
<property name="fieldSetMapper" ref="yourMapper"/>
</bean>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
窥视阅读器示例:
public class YourPeekingReader extends SingleItemPeekableItemReader<YourObject> {
@Override
public YourObject read() {
YourObject item = super.read();
if (item == null) {
return null;
}
while (true) {
YourObject possibleRelatedObject = peek();
if (possibleRelatedObject == null) {
return item;
}
//logic to determine if next line in file relates to same object
boolean matches = false;
if (matches) {
item.addRelatedInfo(super.read());
} else {
return item;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3750 次 |
| 最近记录: |