2011-10-12 74 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(線)!; }' –