Spring批处理数据库到固定格式的文件程序 - 输出到文件中的问题

时间:2012-01-21 07:09:35

标签: spring-batch

我有一个春季批处理程序,我从数据库写入固定格式文件。

我的数据库表包含5列。所有列都包含有关某些产品的说明。该列的类型为varchar,每个大小为200.

我正在阅读我的pojo中的列中的描述为5 String属性即。 desc1,desc2,desc3,desc4,desc5。

我的项目作者如下所示:

<beans:bean id="DbToFileItemWriter" class="org.springframework.batch.item.file.FlatFileItemWriter" scope="step">
    <beans:property name="resource" value="file:c:\TestData\output.dat" /> 

    <beans:property name="lineAggregator">
        <beans:bean class="org.springframework.batch.item.file.transform.FormatterLineAggregator">
            <beans:property name="fieldExtractor">
                <beans:bean class="org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor">
                 <beans:property name="names" value="desc1, desc2, desc3, desc4, desc5" /> 
                </beans:bean>
            </beans:property>

            <beans:property name="format" value="%-20s%-30s%-30s%-30s%-30s" /> 
        </beans:bean>
    </beans:property>
</beans:bean>

如图所示,我希望desc1在20个字符的固定长度字段中,并且desc2通过desc4到每个30个字符的固定长度字段中。

然而,问题是,无论大小如何,我都会得到整个desc字符串。也就是说,如果desc1是数据库中的40个字符,那么它在文件中也会有40个字符。

我觉得它应该只占用前20个字符并忽略其余的字符。

问题是什么?这是一个错误还是我做错了什么?

感谢阅读!

2 个答案:

答案 0 :(得分:3)

FormatterLineAggregator使用了String.format(),因此你可以使用正确的Formatter syntax(*)来获得你想要的东西

两个示例,用于显示格式化程序语法中遗漏的内容

错误:

    // formatted to print out 5 characters minimum
    String wrong = String.format("%-5s", new Object[]{"1234567890"});
    System.out.println(wrong);
    // prints: 1234567890

正确的:

    // formatted to print out 5 characters minimum AND 6 characters maximum
    String correct = String.format("%-5.6s", new Object[]{"1234567890"});
    System.out.println(correct);
    // prints: 123456

(*)这也在FormatterLineAggregator的javadoc中提到

答案 1 :(得分:1)

最简单的解决方案是改变您的读者,例如:您可以在表上创建SQL视图或编写自定义SQL查询,如:

select substr(desc1,1,20), substr(desc2,1,20), ... from my_table

或者,您可以编写自己的FieldExtractor接口实现,该接口应该聚合BeanWrapperFieldExtractor。调用BeanWrapperFieldExtractor#extract()后,它应按给定的最大大小裁剪所有值。