2013-02-19 60 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> 
相关问题