FixedLength 在尝试仅获取值的子集时出现问题
FixedLength giving issues while trying to fetch only a subset of values
我确实有一个文件,在一行中有很多记录或列。此文件正在多个系统中使用。因此,并非所有字段都是我的要求所必需的。因此,如果我只设置值的子集,如下所示
<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)
我们是否必须执行任何特殊操作才能仅获取值的子集
例外情况是该行比您提供的范围短。就像您映射的列太多,而不是太少。
也就是说,您需要映射 FixedLengthTokenizer
中的整个记录。但是,您使用的 FieldSetMapper
不需要使用所有这些字段。
当最终字段实际上不是固定长度,而是比预期的要短时,我遇到了这个异常。所有其他字段都是预期的长度,但最终需要允许更少的字符。
我能够像这样调整最终参数以不包括最终值:
<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 文档:
If the last range is open then the rest of the line is read into that column (irrespective of the strict flag setting)
在 OP 的情况下,最终字段只有 1 个字符,因此此解决方案意义不大,但是,对于更大的范围,即使名称值与提供的列值匹配,它也可能导致相同的错误消息.
我确实有一个文件,在一行中有很多记录或列。此文件正在多个系统中使用。因此,并非所有字段都是我的要求所必需的。因此,如果我只设置值的子集,如下所示
<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)
我们是否必须执行任何特殊操作才能仅获取值的子集
例外情况是该行比您提供的范围短。就像您映射的列太多,而不是太少。
也就是说,您需要映射 FixedLengthTokenizer
中的整个记录。但是,您使用的 FieldSetMapper
不需要使用所有这些字段。
当最终字段实际上不是固定长度,而是比预期的要短时,我遇到了这个异常。所有其他字段都是预期的长度,但最终需要允许更少的字符。
我能够像这样调整最终参数以不包括最终值:
<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 文档:
If the last range is open then the rest of the line is read into that column (irrespective of the strict flag setting)
在 OP 的情况下,最终字段只有 1 个字符,因此此解决方案意义不大,但是,对于更大的范围,即使名称值与提供的列值匹配,它也可能导致相同的错误消息.