2011-10-12 94 views
1

我是Spring批处理新手,遇到问题。春季批中未端双引号

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

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

任何帮助将不胜感激。

+0

你可以发布例外吗?以及您如何从文件中读取? FieldSetMapper等。 – tolitius

+0

Hi tolitius。我正在使用分隔符使用FlatFileItemReader,并且实现了一个FieldSetMapper。我收到了一个IncorrectTokenCount异常。我有5个字段,但对于没有终止双引号的记录,它只有两个字段。 – JPM

回答

1

如果文件没有真正的报价(2个引号),你可以从春季论坛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> 
+0

谢谢Michael!这工作(除了引号字符的值应该只是一个字符)。在文本文件中添加反斜杠并将反斜杠用作“quoteCharacter”后,我最初查看了lineTokenizer属性的属性,但它没有起作用,所以我继续前进。我认为这个属性的文档并不完全清楚。无论如何,你已经救了我很多悲伤,因为我开始写一个自定义的行标记器来转义双引号。再次感谢!!! – JPM

+1

这是不是引入了新的问题?如果@ char出现在csv中怎么办? –

5

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

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

    public class CustomDelimitedLineTokenizer extends DelimitedLineTokenizer { 

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

    } 

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

+1

与lineTokenizer一起,您可能还需要更改recordSeparatorPolicy。我复制所有代码DefaultRecordSeparatorPolicy和改变 '公布尔isEndOfRecord(串线){ 回this.isQuoteUnterminated(线)&& this.isContinued(线);! }' 到 '公布尔isEndOfRecord(串线){ 回this.isContinued(线)!; }' –