Spring Batch中未终止的双引号

JPM*_*JPM 2 java spring spring-batch

我是Spring Batch的新手,我遇到了一个问题.

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

有没有人遇到这个问题,如果有的话,什么是正确的解决方案?遗憾的是,操纵数据本身并不是一种选择.我尝试在每个双引号之前添加一个转义字符,但无论如何都会抛出异常.

任何帮助将不胜感激.

小智 10

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

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

    public class CustomDelimitedLineTokenizer extends DelimitedLineTokenizer {

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

    } 
Run Code Online (Sandbox Code Playgroud)

这样,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); }` (2认同)

Mic*_*low 3

如果文件没有真正的引号(2x 引号字符),您可以使用 spring 论坛中的解决方案更改 DelimitedLineTokenizer 的引号字符

            <property name="lineTokenizer">
                <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="quoteCharacter" value="@" />
                </bean>
            </property>
Run Code Online (Sandbox Code Playgroud)

  • 这不是引入新的问题吗?如果 csv 中出现 @ 字符怎么办? (9认同)