【问题标题】:Reading line breaks in CSV which are quoted in the file in FlatfileItemReader of spring batch读取 CSV 中的换行符,这些换行符在 Spring Batch 的 FlatfileItemReader 中的文件中引用
【发布时间】:2015-06-13 01:58:05
【问题描述】:

我正在尝试使用 FlatFileItemReader 解析 CSV 文件。此 CSV 包含一些引用的换行符,如下所示。

email, name
abc@z.com, "NEW NAME
 ABC"

但此解析失败,必填字段为 2,但实际为 1。

我的 FlatFileReader 配置中缺少什么?

<property name="lineMapper">
            <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">

                <!-- The lineTokenizer divides individual lines up into units of work -->
                <property name="lineTokenizer">
                    <bean
                        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">

                        <!-- Names of the CSV columns -->
                        <property name="names"
                            value="email,name" />
                    </bean>
                </property>

                <!-- The fieldSetMapper maps a line in the file to a Product object -->
                <property name="fieldSetMapper">
                    <bean
                        class="com.abc.testme.batchjobs.util.CustomerFieldSetMapper" />
                </property>
            </bean>
        </property>

【问题讨论】:

  • [email, name..., "quoted..."] 会导致 3 个值,如果我使用 [email, "name,something"] 它会按预期工作,因为引号字符只是说“忽略引号内的 linie 分隔符”,你期望什么?
  • @MichaelPralow 我想解析上面显示的 CSV 文件。
  • 删除未使用的配置
  • 调试后我知道的是,我的 BufferedReader 读取直到遇到换行符。之后它停止阅读。虽然我在这里发布的数据仍然是新的。有没有办法用 spring-batch FlatFileItemReader 解析这样的 CSV 文件?
  • 我没有发现您的配置有任何明显错误,我们对这种情况进行了单元测试 (github.com/spring-projects/spring-batch/blob/master/…),所以我知道它有效。您只在此处显示LineMapper 的配置...您是否使用任何类型的自定义RecordSeparatorPolicy

标签: java spring csv spring-batch


【解决方案1】:

FlatFileItemReader 开箱即用地使用SimpleRecordSeparatorPolicy,用于您的用例

  • 注释部分超过 2 行或更多行

你需要设置DefaultRecordSeparatorPolicy

引用自它的 javadoc:

将所有行视为记录结尾的 RecordSeparatorPolicy,如 只要它们没有未终止的引号,并且不以 a 结尾 继续标记。

xml 配置示例

<bean id="reader" 
      class="org.springframework.batch.item.file.FlatFileItemReader">
      ...
    <property name="recordSeparatorPolicy">
        <bean class="org.springframework.batch.item.file.separator.DefaultRecordSeparatorPolicy" />
    </property>
      ...
</bean>

【讨论】:

  • 非常感谢。我确实读过 RecordSeparatorPolicy 但一定错过了这部分未终止的引号
【解决方案2】:
itemReader.setRecordSeparatorPolicy(new DefaultRecordSeparatorPolicy());

【讨论】:

    猜你喜欢
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 2018-02-23
    • 2013-09-02
    相关资源
    最近更新 更多