2012-12-10 47 views
3

如何配置超級CSV以跳過空白或僅限空白行?如何跳過使用Super CSV的僅限空格的行?

我使用的CsvListReader,有時我會得到我的數據一個空行。當發生這種情況,一個例外的效果:

數CellProcessors必須匹配字段

我想簡單地跳過這些線路的數量。

回答

3

更新:超級CSV 2.1.0(2013年4月發佈),可以提供一個CommentMatcher通過首選項可以讓你跳過被視爲評論的行。有2個內置的匹配器可以使用,或者您可以提供自己的。在這種情況下,您可以使用new CommentMatches("\\s+")跳過空行。


超級CSV只跳過零長度的行(只是一個行結束符)。

如果存在空白行,則不是有效的CSV文件(請參閱RFC4180的rule 4,其中指出Each line should contain the same number of fields throughout the file)。唯一一次空行是有效的,如果它是由引號包圍的多行字段的一部分。例如

column1,column2 
"multi-line field 

with a blank line",value2 

這就是說,它可能會使超級CSV有點空白線(它可以忽略它們)寬鬆。如果你能提供的SourceForge頁面上發佈feature request,我們可以作進一步調查,並有可能在未來的版本中添加此功能。

這並不能幫助你現在雖然!

我沒有做這個了廣泛的測試,但它應該工作:)你可以編寫自己的標記生成器是跳過空白行:

package org.supercsv.io; 

import java.io.IOException; 
import java.io.Reader; 
import java.util.List; 

import org.supercsv.prefs.CsvPreference; 

public class SkipBlankLinesTokenizer extends Tokenizer { 

    public SkipBlankLinesTokenizer(Reader reader, CsvPreference preferences) { 
     super(reader, preferences); 
    } 

    @Override 
    public boolean readColumns(List<String> columns) throws IOException { 

     boolean moreInput = super.readColumns(columns); 

     // keep reading lines if they're blank 
     while (moreInput && (columns.size() == 0 || 
          columns.size() == 1 && 
          columns.get(0).trim().isEmpty())){ 
      moreInput = super.readColumns(columns); 
     } 

     return moreInput; 
    } 

} 

而就進入你的讀者的構造這個(你「將不得不喜好傳遞到讀者和分詞都):

ICsvListReader listReader = null; 
try { 
    CsvPreference prefs = CsvPreference.STANDARD_PREFERENCE; 
    listReader = new CsvListReader(
     new SkipBlankLinesTokenizer(new FileReader(CSV_FILENAME), prefs), 
     prefs); 
... 

希望這有助於

+0

很棒的建議!我在閱讀線上亂搞,但那不是真的正確。我確實需要修改一下你的代碼。一列空白由readColumns()解析,因此columns.size()== 1.我用我使用的代碼更新了答案。 – dkantowitz

+0

嗯...顯然我的編輯到你的答案是等待「同行評議」。下面是新的循環條件:(moreInput && columns.size()== 1個&& columns.get(0).trim()的isEmpty()。) – dkantowitz

+0

好吧,我更新您的編輯,以滿足空行('列。size()== 0')就像我原來的答案(對其他人更有用)。我正在考慮使用'getUntokenizedRow()。trim()。isEmpty()'來代替,但在閱讀製表符分隔的文件時會中斷。 –

0

我不知道這個庫(你應該增加一個Java標籤...),但看着the examples,我看到他們有讀者支持可變數量的每行的行。空行是這種模式的子情況。

或者(可能效率不高),你可以捕獲該異常,並與你的閱讀下去......

+0

‘SuperCSV’標籤是由庫的作者提出要求。 – dkantowitz

+0

這很好,但你可以添加幾個標籤,你知道嗎? :-)很高興你從權威來源獲得答案... – PhiLho