我有这个特别的文件:
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。
答案 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());