【问题标题】:Unterminated Double Quotes in Spring BatchSpring Batch中未终止的双引号
【发布时间】:2011-10-12 02:29:15
【问题描述】:

我是 Spring Batch 的新手,但遇到了问题。

我正在处理的批处理应用程序从分隔的文本文件中读取和处理行。我已将应用程序配置为使用 FlatFileReader 来读取分隔的文本文件,但问题是正在读取的某些数据中包含双引号。当 FlatFileReader 遇到单双引号时会抛出 FlatFileParseException,但是当存在两个双引号时不会抛出任何异常。

有没有人遇到过这个问题,如果有,正确的解决方法是什么?不幸的是,操纵数据本身不是一种选择。我尝试在每个双引号之前添加一个转义字符,但无论如何仍然会引发异常。

任何帮助将不胜感激。

【问题讨论】:

  • 你能发布异常吗?以及您是如何从文件中读取的? FieldSetMapper 等。
  • 你好 tolitius。我正在使用带有分隔符的 FlatFileItemReader,并实现了 FieldSetMapper。我收到了一个 IncorrectTokenCount 异常。我有 5 个字段,但对于带有未终止双引号的记录,它只有两个。

标签: java spring spring-batch


【解决方案1】:

我遇到了同样的问题。 然而,所提出的解决方案不是最佳解决方案。如果您的数据中没有合适的引号字符怎么办? 不幸的是,我们并不总是能够控制输入数据,并且对它们进行预处理通常不是一个好主意。 探索 DelimitedLineTokenizer 源代码,我决定采用这个解决方案,我将与这个答案分享。 它需要覆盖一个类,但这样我们就完全消除了引号字符问题。

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

    public class CustomDelimitedLineTokenizer extends DelimitedLineTokenizer {

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

    } 

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

【讨论】:

  • 与 lineTokenizer 一起,您可能还需要更改 recordSeparatorPolicy。我从 DefaultRecordSeparatorPolicy 复制了所有代码并将 public boolean isEndOfRecord(String line) { return !this.isQuoteUnterminated(line) && !this.isContinued(line); } 更改为 public boolean isEndOfRecord(String line) { return !this.isContinued(line); }
  • 正如 Sammy 建议的那样,我们可以覆盖 DefaultRecordSeparatorPolicy,或者更好的方法是使用 Spring 框架本身的 SimpleRecordSeparatorPolicy。
【解决方案2】:

如果文件没有真正的引号(2x 引号字符),您可以使用 spring 论坛 changing the quote character for the DelimitedLineTokenizer 的解决方案

            <property name="lineTokenizer">
                <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="quoteCharacter" value="@" />
                </bean>
            </property>

【讨论】:

  • 谢谢迈克尔!那行得通(除了引号字符的值应该只是一个字符)。在文本文件中添加反斜杠并将反斜杠用作“quoteCharacter”之后,我最初查看了 lineTokenizer 属性的该属性,但它不起作用,所以我继续前进。在我看来,这个属性的文档并不完全清楚。无论如何,您为我省去了很多麻烦,因为我开始编写自定义行标记器来转义双引号。再次感谢!!!
  • 这不是引入新问题吗?如果 csv 中出现 @ 字符怎么办?
猜你喜欢
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 2021-05-04
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
相关资源
最近更新 更多