如何配置超级CSV跳过空白行或仅空白行?

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

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

我只想跳过这些行。

最佳答案

更新:超级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)。空行唯一有效的时间是它是否是由引号引起来的多行字段的一部分。例如

column1,column2
"multi-line field

with a blank line",value2

话虽这么说,但有可能使Super CSV的空白行变得更宽大一些(它可以忽略它们)。如果您可以在SourceForge页面上发布feature request,我们可以对此进行进一步调查,并有可能在以后的版本中添加此功能。

那现在对您没有帮助!

我尚未对此进行广泛的测试,但是它应该可以工作:)您可以编写自己的 token 程序来跳过空白行:
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;
    }

}

并将其传递给阅读器的构造函数(您必须将首选项传递给阅读器和 token 生成器):
ICsvListReader listReader = null;
try {
    CsvPreference prefs = CsvPreference.STANDARD_PREFERENCE;
    listReader = new CsvListReader(
        new SkipBlankLinesTokenizer(new FileReader(CSV_FILENAME), prefs),
        prefs);
...

希望这可以帮助

关于java - 如何使用Super CSV跳过仅空白行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13797616/

10-10 19:58