我有一个项目阅读器如下:
<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 Docs说:
quoteCharacter的公共setter。引号字符可用于跨行结尾扩展字段或包含包含分隔符的字符串。在引号中,引号字符可用于自我转义,因此“a”“b”“c”被标记为“b”c。
因此,如果我的数据本身包含分隔符(在我的情况下是管道符号),那么我应该用引号字符包围它 - 我做了。例如。第三列包含分隔符的下面一行:
oneColumn|twoColumn|three~|~Column|fourColumn
但是,第三列的java对象里面的值是“three~ | ~Column”而不是“three | Column”。
在结果java对象项的属性中设置值时,是否应该自动处理和忽略用于转义数据中分隔符的引号字符?
在编写器(PreparedStatementSetter或LineAggregator)中再次使用空字符串替换引号字符是唯一的解决方法吗?
感谢阅读!
答案 0 :(得分:1)
如果字符串以引号char开头/结尾,则引用该字符串。 在您的示例中:
oneColumn|twoColumn|~three|Column~|fourColumn
你会得到three|Column
如果字符串包含分隔符,空格,换行符或引号字符本身,则必须引用字符串;如果值的一部分(参见here)