Spring Batch DelimitedLineTokenizer 类 quoteCharacter 属性行为

2024-04-07

我有一个项目阅读器,如下所示:

<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>

从上面可以清楚地看出,我将引号字符从默认的“(双引号)更改为〜(倾斜符号)

现在,Java Docs on DelimitedLineTokenizer on quote character 说:

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

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

oneColumn|twoColumn|three~|~Column|fourColumn

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

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

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

谢谢阅读!


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

oneColumn|twoColumn|~three|Column~|fourColumn

你会得到three|Column如果字符串包含分隔符、空格、换行符或引用字符本身,则必须对其进行引号;如果是值的一部分,则引用 char 必须加倍(请参阅here http://en.wikipedia.org/wiki/Comma-separated_values#Basic_rules_and_examples)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Batch DelimitedLineTokenizer 类 quoteCharacter 属性行为 的相关文章

随机推荐