web-dev-qa-db-ja.com

Apache Commons CSVライブラリーのカプセル化されたトークンと区切り文字間の無効な文字

Apache Commons CSV ライブラリを使用してCSVファイルを解析しているときに、次のエラーが表示されます。

Exception in thread "main" Java.io.IOException: (line 2) invalid char between encapsulated token and delimiter

at org.Apache.commons.csv.Lexer.parseEncapsulatedToken(Lexer.Java:275)
at org.Apache.commons.csv.Lexer.nextToken(Lexer.Java:152)
at org.Apache.commons.csv.CSVParser.nextRecord(CSVParser.Java:450)
at org.Apache.commons.csv.CSVParser.getRecords(CSVParser.Java:327)
at parse.csv.file.CSVFileParser.main(CSVFileParser.Java:29)

このエラーの意味は何ですか?

26

データに引用符を埋め込んだときに、この問題に遭遇しました。

_0,"020"1,"BS:5252525  ORDER:99999"4
_

適用されたソリューションはCSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);でした

@Cugaのヒントは解決に役立ちました。ありがとう@Cuga

完全なコードは

_    public static void main(String[] args) throws IOException {
    FileReader fileReader = null;
    CSVFormat csvFileFormat = CSVFormat.DEFAULT.withQuote(null);
    String fileName = "test.csv";

    fileReader = new FileReader(fileName);
    CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);

    List<CSVRecord> csvRecords = csvFileParser.getRecords();

    for (CSVRecord csvRecord : csvRecords) {
        System.out.println(csvRecord);
    }
    csvFileParser.close();
}
_

結果は

_CSVRecord [comment=null, mapping=null, recordNumber=1, values=[0, "020"1, "BS:5252525  ORDER:99999"4]]
_
36
Anand

CSVファイルのその行には、セルの1つと行の終わり、ファイルの終わり、または次のセルの間に無効な文字が含まれています。これの非常に一般的な原因は、カプセル化文字(各セルを「ラップ」するために使用される文字であるため、CSVはセル(トークン)の開始位置と終了位置を認識できないことです。

8
Steve Siebert

問題の解決策を見つけました。 CSVファイルの1つには、次のような属性があります。 "attribute with nested" quote ""

属性に引用符がネストされているため、パーサーは失敗します。

上記の問題を回避するには、ネストされた引用を次のようにエスケープします。 "attribute with nested" "" "quote" "" "" " =

これが問題を解決する1つの方法です。

7

引用符で囲まれていない入力に引用符を含むデータで、この同じエラーでこれに遭遇しました。つまり:

_some cell|this "cell" caused issues|other data
_

見つけるのは困難でしたが、 Apacheのドキュメント では、nullを値として取ることができるwithQuote()メソッドに言及しています。

まったく同じエラーメッセージが表示されていたため、(ありがたいことに)この問題は修正されました。

2
Cuga