如何配置超級CSV以跳過空白或僅限空白行?如何跳過使用Super CSV的僅限空格的行?
我使用的CsvListReader,有時我會得到我的數據一個空行。當發生這種情況,一個例外的效果:
數CellProcessors必須匹配字段
我想簡單地跳過這些線路的數量。
如何配置超級CSV以跳過空白或僅限空白行?如何跳過使用Super CSV的僅限空格的行?
我使用的CsvListReader,有時我會得到我的數據一個空行。當發生這種情況,一個例外的效果:
數CellProcessors必須匹配字段
我想簡單地跳過這些線路的數量。
更新:超級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);
...
希望這有助於
我不知道這個庫(你應該增加一個Java標籤...),但看着the examples,我看到他們有讀者支持可變數量的每行的行。空行是這種模式的子情況。
或者(可能效率不高),你可以捕獲該異常,並與你的閱讀下去......
‘SuperCSV’標籤是由庫的作者提出要求。 – dkantowitz
這很好,但你可以添加幾個標籤,你知道嗎? :-)很高興你從權威來源獲得答案... – PhiLho
很棒的建議!我在閱讀線上亂搞,但那不是真的正確。我確實需要修改一下你的代碼。一列空白由readColumns()解析,因此columns.size()== 1.我用我使用的代碼更新了答案。 – dkantowitz
嗯...顯然我的編輯到你的答案是等待「同行評議」。下面是新的循環條件:(moreInput && columns.size()== 1個&& columns.get(0).trim()的isEmpty()。) – dkantowitz
好吧,我更新您的編輯,以滿足空行('列。size()== 0')就像我原來的答案(對其他人更有用)。我正在考慮使用'getUntokenizedRow()。trim()。isEmpty()'來代替,但在閱讀製表符分隔的文件時會中斷。 –