我的问题与this问题完全相同,但我无法使用上述解决方案。
总结:
读取csv文件,但包含双引号,如Everything is ok&"some text& this must be another field"&
...(& is delimiter)
因此,通过这个例子,解析是错误的,因为它将多个字段分配给一个
由于csv中的文本种类繁多(无安全引用字符),上述问题的答案无济于事。
我还尝试通过将这段代码放在xml配置中来禁用quoteCharacter:
<bean id="lineTokenizer"
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value="&" />
<property name="quoteCharacter" value="" />
...
但有一个很好的例外:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customLineMapper' defined in class path resource [migration-job.xml]: Cannot resolve reference to bean 'lineTokenizer' while setting bean property 'lineTokenizer'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lineTokenizer' defined in class path resource [migration-job.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'char' for property 'quoteCharacter'; nested exception is java.lang.IllegalArgumentException: String [] with length 0 cannot be converted to char type
是否可以在不指定quoteCharacter常量的情况下读取双引号,或其他可能解决此问题的内容?
更新: 也试过这个:
bean id="lineTokenizer"
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="delimiter" value="&" />
<property name="quoteCharacter"><null/></property>
但又有一个例外:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customLineMapper' defined in class path resource [migration-job.xml]: Cannot resolve reference to bean 'lineTokenizer' while setting bean property 'lineTokenizer'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'lineTokenizer' defined in class path resource [migration-job.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'null' to required type 'char' for property 'quoteCharacter'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [null] to required type [char] for property 'quoteCharacter': PropertyEditor [org.springframework.beans.propertyeditors.CharacterEditor] returned inappropriate value of type [null]
答案 0 :(得分:2)
我刚刚用我的解决方案回答了你的链接问题,因为我今天遇到了这个问题。
尝试我在那里发布的解决方案。它应该工作。
这是指向我的回答的链接:click me
更新: 我直接在这里粘贴答案:
我遇到了同样的问题。然而,所提出的解决方案不是最佳解决方案。如果您的数据中没有合适的引用字符会怎么样?不幸的是我们没有&#39;始终控制输入数据并对其进行预处理通常不是一个好主意。探索DelimitedLineTokenizer源代码我决定采用这个解决方案,我将与此答案分享。它需要覆盖一个类,但是我们完全删除了引号字符问题。
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
public class CustomDelimitedLineTokenizer extends DelimitedLineTokenizer {
@Override
protected boolean isQuoteCharacter(char c) {
return false;
}
}
这样DelimitedLineTokenizer无法识别引号字符。当然,如果我们需要这个功能,那么这个解决方案是不可采用的,但我认为它比提议的解决问题而不是解决它更好。希望它会帮助别人。
答案 1 :(得分:0)
这有点麻烦,但我能够通过将相同的字符设置为分隔符和引号字符来完全禁用引用:
new FlatFileItemReaderBuilder<...>
.delimited()
.delimiter("&")
.quoteCharacter('&')