3

如何配置 Super CSV 以跳过空白行或仅包含空格的行?

我正在使用 CsvListReader,有时我的数据中会出现空行。发生这种情况时,会出现以下情况的异常:

CellProcessor 的数量必须与字段的数量匹配

我想简单地跳过这些行。

4

2 回答 2

3

更新: Super CSV 2.1.0(2013 年 4 月发布)允许您CommentMatcher通过首选项提供一个允许您跳过被视为评论的行的首选项。您可以使用 2 个内置匹配器,也可以提供自己的匹配器。在这种情况下,您可以使用new CommentMatches("\\s+")跳过空白行。


Super CSV 只跳过零​​长度的行(只是一个行终止符)。

如果有空行,则它不是有效的 CSV 文件(请参阅RFC4180 的规则 4,其中指出Each line should contain the same number of fields throughout the file)。空行唯一有效的情况是它是用引号括起来的多行字段的一部分。例如

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;
    }

}

只需将其传递给阅读器的构造函数(您必须将首选项传递给阅读器和标记器):

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

希望这可以帮助

于 2012-12-10T11:30:54.570 回答
0

我不知道这个库(您应该添加一个 Java 标记...),但是查看示例,我看到他们的阅读器支持每行可变数量的行。空行是此模式的子情况。

或者(可能效率较低),您可以捕获异常并继续阅读......

于 2012-12-10T09:01:16.633 回答