0

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

<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)中再次用空字符串替换引号字符是唯一的解决方案吗?

谢谢阅读!

4

1 回答 1

1

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

oneColumn|twoColumn|~three|Column~|fourColumn

three|Column 如果字符串包含分隔符、空格、换行符或引用字符本身,您将得到You have to quote string;如果值的一部分,引用 char 必须加倍(请参见此处

于 2013-08-01T16:31:07.833 回答