如何配置Super CSV以跳过空白或仅限空白行?
我使用的是CsvListReader,有时我的数据会出现空白行。发生这种情况时,会产生以下异常:
CellProcessors的数量必须匹配字段数
我想简单地跳过这些界限。
答案 0 :(得分:3)
更新:Super CSV 2.1.0(2013年4月发布)允许您通过首选项提供CommentMatcher
,以便跳过被视为评论的行。您可以使用2种内置匹配器,或者您可以自己提供。在这种情况下,您可以使用new CommentMatches("\\s+")
跳过空白行。
Super CSV仅跳过零长度的行(只是一个行终止符)。
如果有空行,则它不是有效的CSV文件(请参阅RFC4180的rule 4,其中指出Each line should contain the same number of fields throughout the file
)。空行有效的唯一时间是它是由引号括起的多行字段的一部分。 e.g。
column1,column2
"multi-line field
with a blank line",value2
话虽这么说,也许可以使用空行使Super 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);
...
希望这有帮助
答案 1 :(得分:0)
我不知道这个库(你应该添加一个Java标签......),但是看the examples,我看到他们有读者支持每行可变数量的行。空行是此模式的子案例。
或者(可能效率较低),你可以抓住异常并继续阅读......