1

PatternMatchingCompositeLineMapper各行の列数が異なるため、解析する非常に大きなtxtファイルがあります。このファイルには、複数の期間のデータがあります。このファイルの各期間は、この期間の日付を含むヘッダー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

おそらく、 を介してこれを行うことができますClassifierCompositeItemWriterMyDomainObject同じ入力に示されているように、開始日と終了日の両方を持つドメイン オブジェクト (たとえば、) があると仮定します。

まず、メソッドを宣言するクラスを作成し、classifyそれに注釈を付ける必要があり@Classifierます。これは、アイテムを下にあるアイテムライターの1つに効果的にルーティングするものです(あなたの場合、レコードの開始日と終了日が基準日にわたるかどうかに基づいて)。

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次に、分類子によって設定された値に基づいて、基になる 2 つのアイテム ライターのいずれかに委任するように を構成する必要があります。この場合、必要に応じてセットアップしfile1Writerますfile2Writerが、私が収集したのはフラット ファイル アイテム ライターだけです。

<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 に答える