1

我正在解析非常大的 txt 文件,PatternMatchingCompositeLineMapper因为每一行都有不同的列数。
在这个文件中,我有来自多个时期的数据,这个文件中的每个时期都由带有该时期日期的标题DATA表示。在此标题之后,有与此期间相关的数据行,它们以标题STOP结尾。
问题是我需要将在特定日期之前和之后结束的所有期间的数据保存到另一个文件中。
有没有办法在 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
4

1 回答 1

1

您可能可以通过ClassifierCompositeItemWriter. 我将假设您有一个域对象(例如,MyDomainObject),它具有相同输入中显示的开始日期和结束日期。

您首先需要创建一个声明classify方法的类并用@Classifier. 这将有效地将项目路由给下级项目作者之一(在您的情况下,基于记录的开始日期和结束日期是否跨越参考日期)。

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";
        }
    }
}

接下来,您需要ClassifierCompositeItemWriter根据分类器设置的值将 配置为委托给两个底层项目编写器之一。在这种情况下,您将根据需要进行设置file1Writerfile2Writer我收集的只是平面文件项目编写器。

<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>
于 2013-02-21T17:12:38.073 回答