2016-04-27 22 views
2

私はhttps://docs.spring.io/spring-batch/reference/html/patterns.html#multiLineRecordsマルチライン・レコードリーダー(スタート接頭辞=エンドプレフィックス)

に基づくマルチライン・レコードリーダーソリューションを実装しています私は、次のフラットファイルがあります。

HEA;0013100345;2007-02-15 
NCU;Smith;Peter;;T;20014539;F 
BAD;;Oak Street 31/A;;Small Town;00235;IL;US 
HEA;0013100345;2007-02-15 
NCU;Smith;Peter;;T;20014539;F 
HEA;0013100345;2007-02-15 

HEAを(とオプションでNCU、BAD)を1つのオブジェクトに変換する必要があります。
私の場合、私は "end"行を持っていないので、 "HEA"は新しいItemの開始と前のものの終了を同時に表します。

Dean Clarkに感謝します。これは、溶液のJavaの設定です:リファレンスドキュメントが言及したよう

@Bean 
public FlatFileItemReader<FieldSet> readerFlat() { 
    FlatFileItemReader<FieldSet> reader = new FlatFileItemReader<>(); 
    reader.setResource(new ClassPathResource("multirecord.txt")); 
    reader.setLineMapper(compositeLineMapper()); 
    return reader; 
} 

@Bean 
public SingleItemPeekableItemReader<FieldSet> readerPeek() { 
    SingleItemPeekableItemReader<FieldSet> reader = new SingleItemPeekableItemReader<FieldSet>() {{ 
     setDelegate(readerFlat()); 
    }}; 
    return reader; 
} 

@Bean 
public MultiLineCaseItemReader readerMultirecord() { 
    MultiLineCaseItemReader multiReader = new MultiLineCaseItemReader() {{ 
     setDelegate(readerPeek()); 
    }}; 
    return multiReader; 
} 

は、次にカスタムMultiLineCaseItemReaderにあなたは両方read()peek()

答えて

3

を行うことができ、あなたはFlatFileItemReaderをラップするItemReaderのカスタム実装を作成する必要があります。

具体的には、SingleItemPeekableItemReaderを拡張し、FlatFileItemReaderを代理人として使用することができます。

あなたはpeek()を次のアイテムに送ります。それがあなたのcurrent itemの一部なら、あなたの商品を増やしてください。次の「ヘッダー」行の場合は、作業中のアイテムを終了し、current itemを返すことができます。

次に、ファイルの場所を失うことなく、または再開可能性を混乱させずに、ちょうど覗いた行で次のread()が始まります。

+0

ディーンありがとうございます!これはまさに私が探していたものです。ワンちゃん、なぜ春のバッチリファレンスガイドは、SingleItemPeekableItemReaderについて何も持っていません... – mirrow

+1

ディーン、あなたは親切に文を "あなたが働いているアイテムは、次の"ヘッダー "行の場合は変更しますか?いくつかの言葉が欠けているように聞こえるからです:) – anton1980