我正在编写一个读取CSV文件的Spring Batch应用程序,执行一些转换并将修改后的CSV写入要发送到另一个批处理过程。
我的编写器配置如下所示:
<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="column1, column2, column3, column4 ------ 322 fields " />
</beans:bean>
</beans:property>
<beans:property name="format" value="%-8s%-12s%-11s%-16s" ----322 fields />
</beans:bean>
</beans:property>
我必须写大约322个字段。我无法让任何FormatterLineAggregator
来完成我的工作。如果我写的格式如
<property name="format" value="%s;%s;%s;%s;%s;%s;%s;%f;%f;%s;%f;%f;%td.%tm.%tY;%td.%tm.%<tY;%s;%td.%tm.%<tY;%s;%s;%s;%s;%td.%tm.%tY" /> ,
它变得非常混乱,很难确保所有领域都是正确的。
我想到了3种不同的解决方案:
要么采用上述方法。
写一个CustomEditorFieldsExtractor
但不知道在课堂上写什么以及如何格式化字段。 (较受欢迎)
使用&#34;非标准&#34; BeanIO框架jar,但我担心我的客户不同意这个解决方案。
有人可以提供一些意见吗。感谢您的帮助!
答案 0 :(得分:0)
您可以通过以下方式继续解决方案#2:
LineAggregator
并使其与第1点的指令配合使用class Aggregator implements LineAggregator<T> {
private Map<String, String> propertyFormat;
public String aggregate(T item) {
final StringBuilder sb = new StringBuilder();
for(final String property : propertyFormat.keySet()) {
final String format = propertyFormat.get(property);
final Object propertyValue = /* Extract property from item using Spring beans */;
sb.append(String.format(format, propertyValue));
}
return sb.toString();
}
}