【问题标题】:Spring Batch DelimitedLineTokenizer class quoteCharacter property behaviorSpring Batch DelimitedLineTokenizer 类 quoteCharacter 属性行为
【发布时间】:2013-08-02 15:06:53
【问题描述】:

我有一个如下的项目阅读器:

<beans:bean id="myItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
<beans:property name="resource" ref="myFileResource" />
    <beans:property name="lineMapper">
        <beans:bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <beans:property name="lineTokenizer">
                <beans:bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <beans:property name="delimiter" value="|"/>
                    <beans:property name="quoteCharacter" value="~"/>
                    <beans:property name="names" value="${my_column_names}" />
                </beans:bean>
            </beans:property>
            <beans:property name="fieldSetMapper">
            <beans:bean class="${my_mapper_class_name}" />
        </beans:property>
    </beans:bean>
</beans:property>

如上所述,我将引号字符从默认的 "(双引号)更改为 ~(倾斜符号)

现在,关于引号字符的 DelimitedLineTokenizer 的 Java 文档说:

quoteCharacter 的公共设置器。引号字符可用于跨行结尾扩展字段或包含包含分隔符的字符串。在带引号的标记内,引号字符可用于转义自身,因此 "a""b""c" 被标记为 a"b"c。

因此,如果我的数据本身包含分隔符(在我的例子中是管道符号),那么我应该用引号字符将它括起来 - 我这样做了。例如。下面的第三列包含分隔符的行:

oneColumn|twoColumn|three~|~Column|fourColumn

但是,我的 java 对象中第三列的值是“three~|~Column”,而不是应该的“three|Column”。

在生成的 java 对象项的属性内设置值时,是否应该自动处理和忽略用于转义数据中分隔符的引号字符?

在编写器(PreparedStatementSetter 或 LineAggregator)中再次用空字符串替换引号字符是解决此问题的唯一方法吗?

感谢阅读!

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    如果字符串以引号字符开头/结尾,则该字符串应被引用。 在您的示例中:

    oneColumn|twoColumn|~three|Column~|fourColumn
    

    你会得到three|Column 如果字符串包含分隔符、空格、换行符或引用字符本身,则必须引用字符串;如果是值的一部分,则引用 char 必须加倍(参见 here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 2012-06-18
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-20
      相关资源
      最近更新 更多