Java Spring批处理:在有效标头之后写入行
我有一个非常大的txt文件,我正在用Java Spring批处理:在有效标头之后写入行,java,parsing,spring-batch,Java,Parsing,Spring Batch,我有一个非常大的txt文件,我正在用PatternMatchingCompositeLineMapper解析它,因为每一行有不同的列数。 在这个文件中,我有来自多个时期的数据,这个文件中的每个时期都由标题数据和这个时期的日期表示。在该页眉之后,有与该期间相关的数据行,它们以页眉停止结束。 问题是,我需要将特定日期之前开始和之后结束的所有时段的数据保存到另一个文件中。在Spring Batch中是否有这样做的方法? 示例文件如下所示: DATA|20121113-20121212 STRT|33|
PatternMatchingCompositeLineMapper
解析它,因为每一行有不同的列数。在这个文件中,我有来自多个时期的数据,这个文件中的每个时期都由标题数据和这个时期的日期表示。在该页眉之后,有与该期间相关的数据行,它们以页眉停止结束。
问题是,我需要将特定日期之前开始和之后结束的所有时段的数据保存到另一个文件中。
在Spring Batch中是否有这样做的方法?
示例文件如下所示:
DATA|20121113-20121212
STRT|33|20121213|123425654|123
ASD|asd|asd|asd
QWE|qwe|qwe
ZXC|zxc|zxc|zxc|zxc
STOP
DATA|20121213-20130112
STRT|33|20130113|65465463546|123
ASD|asd|asd|asd
QWE|qwe|qwe
ZXC|zxc|zxc|zxc|zxc
STOP
DATA|20121113-20121212
STRT|33|20121213|34653465546|123.10
ASD|asd|asd|asd
QWE|qwe|qwe
ZXC|zxc|zxc|zxc|zxc
STOP
DATA|20120713-20120812
STRT|33|20121213|34654356546|123.10
STOP
DATA|20121213-20130112
STRT|33|20130113|345646345|123.10
ASD|asd|asd|asd
QWE|qwe|qwe
ZXC|zxc|zxc|zxc|zxc
STOP
你可能可以通过一个网络来实现。我假设您有一个域对象(比如,
MyDomainObject
),它的开始日期和结束日期与您的输入相同
您首先需要创建一个类,该类声明一个classify
方法并用注释对其进行注释。这将有效地将项目路由到一个正在进行项目写入的项目写入器(在您的情况下,基于记录的开始和结束日期是否跨越参考日期)
你可能可以通过一个网络来实现。我假设您有一个域对象(比如,
MyDomainObject
),它的开始日期和结束日期与您的输入相同
您首先需要创建一个类,该类声明一个classify
方法并用注释对其进行注释。这将有效地将项目路由到一个正在进行项目写入的项目写入器(在您的情况下,基于记录的开始和结束日期是否跨越参考日期)
import org.springframework.batch.support.annotation.Classifier;
public class MyDateClassifierDelegate {
//set this via Spring, or whatever
private final Date referenceDate;
@Classifier
public String classify(MyDomainObject classifiable) {
if(classifiable.startDate.compareTo(referenceDate) < 0
&& classifiable.endDate.compareTo(referenceDate) >= 0) {
return "FILE1";
}
else {
return "FILE2";
}
}
}
<beans:bean id="dateRangeBasedFileWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
<beans:property name="classifier">
<beans:bean class="org.springframework.batch.classify.BackToBackPatternClassifier">
<beans:property name="routerDelegate">
<!-- this is where you specify the classifier that is to be used -->
<beans:bean class="MyDateClassifierDelegate" />
</beans:property>
<beans:property name="matcherMap">
<beans:map>
<!-- this will contain your "spanning reference date" items -->
<beans:entry key="FILE1" value-ref="file1Writer" />
<!-- this will contain your "not spanning reference date" items -->
<beans:entry key="FILE2" value-ref="file2Writer" />
</beans:map>
</beans:property>
</beans:bean>
</beans:property>
</beans:bean>