从Spring Batch上的文件中跳过标题,正文和页脚行

时间:2014-01-06 18:31:39

标签: spring batch-processing spring-batch

我有这个特别的文件:

H;COD;CREATION_DATE;TOT_POR;TYPE
H;001;2013-10-30;20;R
D;DETAIL_VALUE;PROP_VALUE
D;003;3030
D;002;3031
D;005;3032
T;NUM_FOL;TOT
T;1;503.45

如您所见,它有标题/正文/页脚行。我正在寻找跳过这些行的ItemReader。我已经使用 PatternMatchingCompositeLineMapper 完成了下面的ItemReader识别这些行。

<bean id="fileReader" class="org.springframework.batch.item.file.FlatFileItemReader">
        <property name="resource" ref="myFileReference" />
        <property name="lineMapper">
            <bean class="org.springframework.batch.item.file.mapping.PatternMatchingCompositeLineMapper">
                <property name="tokenizers">
                    <map>
                        <entry key="H*" value-ref="headerLineTokenizer"/>
                        <entry key="D*" value-ref="bodyLineTokenizer"/>
                        <entry key="T*" value-ref="footerLineTokenizer"/>
                    </map>
                </property>
                <property name="fieldSetMappers">
                    <map>
                        <entry key="H*" value-ref="headerMapper"/>
                        <entry key="D*" value-ref="bodyMapper"/>
                        <entry key="T*" value-ref="footerMapper"/>
                    </map>
                </property>
            </bean>
        </property>
    </bean>

我尝试添加linesToSkip属性等于1,但它只跳过标题行。有没有办法跳过每个块的第一行(页眉,正文和页脚)?

THKS。

2 个答案:

答案 0 :(得分:3)

不。 linesToSkip(正如您所写)只是跳过第一行linesToSkip行 您必须使用multiorder-line example(或this post)作为基础编写自己的阅读器,并手动管理每个块的第一行跳过

答案 1 :(得分:0)

另一个选择是这个:

1-创建一个阅读器工厂

public class CustomFileReaderFactory implements BufferedReaderFactory {
@Override
public BufferedReader create(Resource resource, String encoding) throws IOException {
    return new CustomFileReader(new InputStreamReader(resource.getInputStream(), encoding));
}

2-创建CustomFileReader(这将读取一行并决定是否继续或我们跳过)并确保覆盖readLine()方法。

public class CustomFileReader extends BufferedReader {

public CustomFileReader(Reader in) {
    super(in);
}

@Override
public String readLine() throws IOException {
    String line = super.readLine();
    // your logic here
    if (hasToBeIgnored(line)) {
        return null;
    }
    return line;
}

3-将全新的Factory设置为FlatFileItemReader:

yourFlatFileItemReader.setBufferedReaderFactory(new CustomFileReaderFactory());