RecordSeperatorPolicy Spring按长度/字符数批量

时间:2015-10-05 08:21:55

标签: java spring spring-batch

用例: 一个.dat传统平面文件(File2),有大约200万条记录,其长度是固定的。需要读取该文件,并且在每条记录中都有一个唯一的ID,我需要抓取并检查文件的差异集(File1)并删除此记录。

我做了什么? 我配置了2个工作。第一个作业将使用FixedLengthTokenizer读取File1并将获取唯一的ID并写入我在其上配置了一个tasklet以使用Apache Lucene创建索引的diff文件。

第二个作业是读取File2,现在,这个文件有点棘手。没有分隔符或记录分隔符。我所知道的是每条记录都包含大约1400个字符。我研究了很多,我唯一希望的是这个 RecordSeparatorPolicy 我不知道如何为这个用例实现。 在读取每条记录后,在处理器中我需要搜索在Job1中创建的索引,然后以某种方式删除File2中的记录。

我在哪里挣扎? 因此,我需要生成的输出文件不应该触摸或转换文件的原始格式。现在,有没有办法在同一个文件中删除该记录,而不是使用ItemWriter创建一个新文件?我的猜测是否定的。 所以,我使用PassThroughLineMapper,它将整个文件作为单个String读取。这是一个200万条记录文件,其中每条记录有1400个字符。 Java String也不能容纳那么多。 其他想法是,编写一个自定义ItemReader,我将在其中使用BufferedReader并以某种方式将1400个字符分成一行,然后将其发送到处理器。但这也不起作用。

如何阅读此类文件?此外,我不想使用任何类型的POJO,因为我需要文件的确切方式,并且我没有改变任何东西。 请提出一个方法。

1 个答案:

答案 0 :(得分:0)

您可以使用FixedLengthTokenizer类来阅读源文件。它允许您为源文件的每一行指定字段数及其各自的长度。

另请参阅:Springbatch documentation §6.6.2

以下是一个例子:

<bean id="tokenizer" class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
    <property name="names" value="column1, column2, column3, column4" />
    <property name="columns" value="1-100, 101-349, 350-1000, 1001-1400" />               
</bean>

<强>更新

如果您的记录不同,则会有一个类PatternMatchingCompositeLineTokenizer,它可以匹配单个文件中的多个类型。

有关此类实现的更多信息(和示例),请参阅:SpringBatch Patterns §11.5 - Multi-Line Records