3

空白または空白のみの行をスキップするようにスーパーCSVを構成するにはどうすればよいですか?

CsvListReaderを使用していますが、データに空白行が表示されることがあります。これが発生した場合、次の効果の例外:

CellProcessorsの数はフィールドの数と一致する必要があります

これらの行をスキップしたいと思います。

4

2 に答える 2

3

更新: Super CSV 2.1.0(2013年4月リリース)では、CommentMatcherコメントと見なされる行をスキップできる設定を介してを提供できます。使用できる2つの組み込みマッチャーがあります。または、独自のマッチャーを提供することもできます。この場合、new CommentMatches("\\s+")空白行をスキップするために使用できます。


スーパーCSVは、長さがゼロの行のみをスキップします(行末記号のみ)。

空白行がある場合、それは有効なCSVファイルではありません(RFC4180のルール4Each 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タグを追加する必要があります...)、を見ると、1行あたりの行数が可変であるリーダーが含まれていることがわかります。空の行は、このパターンのサブケースです。

あるいは(おそらく効率が悪い)、例外をキャッチして読み続けることができます...

于 2012-12-10T09:01:16.633 に答える