Java 如何使用超级CSV跳过仅空白行?

Java 如何使用超级CSV跳过仅空白行?,java,csv,supercsv,Java,Csv,Supercsv,如何将Super CSV配置为跳过空白或仅空白行 我正在使用CsvListReader,有时我会在数据中得到一个空行。发生这种情况时,例外情况如下: CellProcessor的数量必须与字段的数量匹配 我只想跳过这几行 我不知道这个库(您应该添加一个Java标记…),但是看看,我发现它们的读卡器支持每行可变的行数。空行是此模式的一个子案例 或者(可能效率较低),您可以捕获异常并继续阅读……更新:Super CSV 2.1.0(2013年4月发布)允许您通过首选项提供一个注释匹配器,该首选项允许

如何将Super CSV配置为跳过空白或仅空白行

我正在使用CsvListReader,有时我会在数据中得到一个空行。发生这种情况时,例外情况如下:

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


我只想跳过这几行

我不知道这个库(您应该添加一个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);
...