Java 如何使用超级CSV跳过仅空白行?
如何将Super CSV配置为跳过空白或仅空白行 我正在使用CsvListReader,有时我会在数据中得到一个空行。发生这种情况时,例外情况如下: CellProcessor的数量必须与字段的数量匹配Java 如何使用超级CSV跳过仅空白行?,java,csv,supercsv,Java,Csv,Supercsv,如何将Super CSV配置为跳过空白或仅空白行 我正在使用CsvListReader,有时我会在数据中得到一个空行。发生这种情况时,例外情况如下: CellProcessor的数量必须与字段的数量匹配 我只想跳过这几行 我不知道这个库(您应该添加一个Java标记…),但是看看,我发现它们的读卡器支持每行可变的行数。空行是此模式的一个子案例 或者(可能效率较低),您可以捕获异常并继续阅读……更新:Super CSV 2.1.0(2013年4月发布)允许您通过首选项提供一个注释匹配器,该首选项允许
我只想跳过这几行 我不知道这个库(您应该添加一个Java标记…),但是看看,我发现它们的读卡器支持每行可变的行数。空行是此模式的一个子案例
或者(可能效率较低),您可以捕获异常并继续阅读……更新:Super CSV 2.1.0(2013年4月发布)允许您通过首选项提供一个
注释匹配器,该首选项允许您跳过被视为注释的行。有2个内置匹配器,您可以使用,也可以自己提供。在这种情况下,您可以使用newcommentmatches(“\\s+”)
跳过空行
超级CSV仅跳过长度为零的行(仅为行终止符)
如果有空行,则它不是有效的CSV文件(请参阅RFC4180的第页,其中指出,每行应包含文件中相同数量的字段
)。空行只有在它是多行字段的一部分并用引号括起来时才有效。e、 g
column1,column2
"multi-line field
with a blank line",value2
也就是说,有可能让Super CSV对空行更宽松一些(它可以忽略它们)。如果您可以在我们的SourceForge页面上发布一篇文章,我们可以对此进行进一步研究,并可能在将来的版本中添加此功能
但是现在这对你没有帮助
我还没有对此做过广泛的测试,但它应该可以工作:)您可以编写自己的标记器来跳过空行:
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;
}
}
希望这有帮助'SuperCSV'标记是库作者要求的。这很好,但你可以添加几个标记,你知道吗?:-)很高兴你从权威人士那里得到了答案…很好的建议!我在读台词的时候胡闹,但那不是真的正确。我确实需要修改一下你的代码。readColumns()解析一列空白,因此columns.size()==1。我用我使用的代码更新了你的答案。嗯……显然我对你答案的编辑正在等待“同行评审”。这是新的循环条件:(moreInput&&columns.size()==1&&columns.get(0.trim().isEmpty())好的,我更新了您的编辑以适应空行(columns.size()==0
),就像我原来的答案一样(它对其他人更有用)。我正在考虑改用getUntokenizedRow().trim().isEmpty()
,但在读取以制表符分隔的文件时,这会中断。
ICsvListReader listReader = null;
try {
CsvPreference prefs = CsvPreference.STANDARD_PREFERENCE;
listReader = new CsvListReader(
new SkipBlankLinesTokenizer(new FileReader(CSV_FILENAME), prefs),
prefs);
...