2013-02-19 56 views
1

我有非常大的txt文件,我使用PatternMatchingCompositeLineMapper解析,因爲每行的列數都不相同。
在這個文件中,我有來自多個時期的數據,這個文件中的每個時期由標題數據表示,並帶有這個時期的日期。在這個標題之後,有與此期間有關的數據的行,並且以標題STOP結束。
問題是我需要將所有在特定日期之前開始和結束之後開始的期間的數據保存到另一個文件中。
有沒有辦法在Spring Batch中做到這一點?
示例文件看起來是這樣的:Spring批處理:在有效標題之後寫入行

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 

回答

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> 
相關問題