Spring批次以不同的顺序读取csv列

时间:2013-08-21 13:45:31

标签: csv spring-batch

我使用spring批处理自动读取csv文件并将每一行映射到一个对象中。下面有代码。 csv文件中的列是ID,field1,field2,field3。这是我在lineTokenizer中写的顺序。但是,FlatFileItemReader不按此顺序读取文件。相反,它似乎以随机顺序读取,首先读取field2,然后读取ID,然后读取field3,然后读取field1。但我希望它首先读取ID,因为我正在尝试编写一个将ID映射到每个字段的地图。有没有办法改变FlatFileItemReader读取csv中列的顺序?

<bean id="mappedPosition" class="com.jpmorgan.ib.colopt.input.MappedPosition" scope="prototype" />
<bean id="positionFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
      <property name="resource" value="position.csv" />
      <property name="lineMapper">
           <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
                 <property name="lineTokenizer">
                       <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                             <property name="names" value="ID, field1, field2, field3" />
                       </bean>
                  </property>
                  <property name="fieldSetMapper">
                        <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                              <property name="prototypeBeanName" value="mappedPosition"/>
                        </bean>
                  </property>
                 </bean>
      </property>
</bean>

1 个答案:

答案 0 :(得分:1)

Spring-batch按预期顺序读取和标记CSV中的字段 问题出在BeanWrapperFieldSetMapper:将FieldSet值注入bean的属性映射器,从String[](按字段名称排序)传递到Properties(查看FieldSet.getProperties() })匹配属性值 我认为您可以在阅读后使用StepExecutionListener和拦截项目实现目标(您将mappedPosition完全取消)