【问题标题】:Disable entirely QuoteCharacter in DelimitedLineTokenizer在 DelimitedLineTokenizer 中完全禁用 QuoteCharacter
【发布时间】:2014-03-27 11:50:26
【问题描述】:

我的问题与this 的问题一模一样,但我无法使用提到的解决方案。

总结: 读取了一个 csv 文件,但包含这样的双引号 Everything is ok&"some text& this must be another field"&...(& 是分隔符)

所以通过这个例子,解析是错误的,因为它将多个字段分配给一个
由于 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]

【问题讨论】:

  • 您是否尝试将值设置为&lt;null/&gt;
  • @bellabax 我现在尝试使用 null - 更新的问题,仍然没有:(

标签: spring-batch


【解决方案1】:

我刚刚在一个小时前用我的解决方案回答了您的链接问题,因为我今天遇到了这个问题。

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

这里是我的答案的链接: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 就无法识别引号字符。当然,如果我们需要这个功能,那么这个解决方案是不可采用的,但是我认为它比只对问题进行排序而不是解决它的提议要好。希望它会对某人有所帮助。

【讨论】:

    【解决方案2】:

    这有点麻烦,但我可以通过将相同的字符设置为分隔符和引号字符来完全禁用引用:

    new FlatFileItemReaderBuilder<...>
            .delimited()
            .delimiter("&")
            .quoteCharacter('&')
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 2015-08-24
      • 2015-05-15
      • 2014-04-22
      • 2012-05-03
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多