FixedLength在尝试仅获取值的子集时发出问题

时间:2018-03-04 13:26:40

标签: java spring spring-batch batch-processing

我的文件在一行中有很多记录或列。该文件正在多个系统中使用。因此,并非所有字段都是我的要求所必需的。因此,如果我只设置一个值的子集,如下所示

<property name="lineTokenizer">
    <bean class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
        <property name="names" value="aa,cc,vv,bb" />
        <property name="columns" value="1-578,579-579,580-580,581-581" />
    </bean>
</property>

我得到如下例外

org.springframework.batch.item.file.transform.IncorrectLineLengthException: Line is shorter than max range 581
org.springframework.batch.item.file.transform.FixedLengthTokenizer.doTokenize(FixedLengthTokenizer.java:109)
org.springframework.batch.item.file.transform.AbstractLineTokenizer.tokenize(AbstractLineTokenizer.java:112)
org.springframework.batch.item.file.mapping.DefaultLineMapper.mapLine(DefaultLineMapper.java:43)
org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:180)

我们是否必须采取任何特殊措施才能获取值的子集

2 个答案:

答案 0 :(得分:2)

例外情况是该行更短而不是您提供的范围。就像在,你要映射太多列,而不是太少。

话虽如此,您需要在FixedLengthTokenizer中映射整个记录。但是,您使用的FieldSetMapper不需要使用所有这些字段。

答案 1 :(得分:0)

当最终字段实际上不是固定长度,而是比预期的短时,我遇到了此异常。所有其他字段都是预期的长度,但是最后一个字段需要允许更少的字符。

我能够将最终参数调整为不包括最终值,例如:

<property name="lineTokenizer">
    <bean class="org.springframework.batch.item.file.transform.FixedLengthTokenizer">
        <property name="names" value="aa,cc,vv,bb" />
        <property name="columns" value="1-578,579-579,580-580,581" />
    </bean>
</property>

每个Spring文档:

  

如果最后一个范围是打开的,则将其余行读入该列(与严格标志设置无关)

对于OP,最后一个字段只有1个字符,因此此解决方案意义不大,但是,即使名称值与提供的列值匹配,较大的范围也可能导致相同的错误消息。 / p>

来源: Fixed Length Tokenizer Documentation