【问题标题】:How to read CSV file with different number of columns with Spring Batch如何使用 Spring Batch 读取具有不同列数的 CSV 文件
【发布时间】:2017-08-04 08:25:27
【问题描述】:

我有一个没有固定列数的 CSV 文件,如下所示:

  col1,col2,col3,col4,col5    
  val1,val2,val3,val4,val5 
  column1,column2,column3
  value1,value2,value3

有没有办法用 Spring Batch 读取这种 CSV 文件?

我尝试过这样做:

<bean id="ItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">

    <!-- Read a csv file -->
    <property name="resource" value="classpath:file.csv" />

    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <!-- split it -->
            <property name="lineTokenizer">
                <bean
                    class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names"
                        value="col1,col2,col3,col4,col5,column1,column2,column3" />
                </bean>
            </property>
            <property name="fieldSetMapper">
                <bean
                    class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                    <property name="prototypeBeanName" value="myBean" />
                </bean>
            </property>

        </bean>
    </property>

</bean>

但结果是这个错误:

【问题讨论】:

  • 查看AbstractLineTokenizer#setStrict(boolean)DelimitedLineTokenizer 继承自)并将其设置为false
  • 这个方法不起作用:(

标签: spring file csv spring-batch


【解决方案1】:

您可以使用PatternMatchingCompositeLineMapper 根据模式将每行委托给适当的LineMapper 实现。从那里,您的每个代表将使用DelimtedLineTokenizerFieldSetMapper 相应地映射线路。

您可以在此处的文档中阅读更多相关信息:http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/file/mapping/PatternMatchingCompositeLineMapper.html

【讨论】:

  • 非常感谢@Michael
【解决方案2】:

您的DelimitedLineTokenizer 中的AbstractLineTokenizer#setStrict(boolean) 应该可以完成这项工作。

来自javadoc

严格标志的公共设置器。如果为真(默认),则编号 行中的标记数必须与定义的标记数相匹配(由范围, LineTokenizer 中的列等)。如果为 false,则标记较少的行 将被容忍并用空列填充,并用更多的行填充 标记将被截断。

您应该将这部分配置更改为:

<bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
    <property name="names" value="col1,col2,col3,col4,col5,column1,column2,column3" />
    <property name="strict" value="false" />
</bean>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2021-11-09
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2022-06-30
    相关资源
    最近更新 更多