2014-03-27 439 views
0

我的问题是完全一样this问题,但我不能用提到的解决方案。
禁用完全QuoteCharacter在DelimitedLineTokenizer

之和行动: CSV文件读取,但包含这样Everything is ok&"some text& this must be another field"&双引号......(&是分隔符)

因此,通过这个例子中,分析是错误的,因为它assignes多个领域的一个
由于csv中的文本种类繁多(无安全quoteCharacter),上述问题的答案将无济于事。
我也试图通过把这段代码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常量,或其他可能解决这个问题的东西?

UPDATE: 也试过这样:

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] 
+1

您是否尝试将值设置为''? –

+0

@bellabax我现在尝试null - 更新的问题,仍然没有:( – dimzak

回答

2

我刚刚与我的解决办法回答你的链接的问题一个小时前,因为我遇到了这个问题今天。

试试我在那里发布的解决方案。它应该工作。

这里链接到我的回答是:click me

更新: 我贴我的答案直接在这里:

我遇到了同样的问题。然而,提出的解决方案并不是最优解决方案。如果在你的数据中没有合适的引用字符呢?不幸的是,我们并不总是能够控制输入数据,并且对它们进行预处理并不总是一个好主意。探索DelimitedLineTokenizer源代码我决定采用这个解决方案,我将与这个答案分享。它需要重写一个类,但是由此我们完全删除了引号字符问题。

import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; 

    public class CustomDelimitedLineTokenizer extends DelimitedLineTokenizer { 

     @Override 
     protected boolean isQuoteCharacter(char c) { 
      return false; 
     } 

    } 

这样,DelimitedLineTokenizer无法识别引号字符。当然,如果我们需要这个功能,那么这个解决方案是不可行的,但是我认为它比提出的问题更好,而不是解决问题。希望它能帮助别人。