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)
このエラーの意味は何ですか?
データに引用符を埋め込んだときに、この問題に遭遇しました。
_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]]
_
CSVファイルのその行には、セルの1つと行の終わり、ファイルの終わり、または次のセルの間に無効な文字が含まれています。これの非常に一般的な原因は、カプセル化文字(各セルを「ラップ」するために使用される文字であるため、CSVはセル(トークン)の開始位置と終了位置を認識できないことです。
問題の解決策を見つけました。 CSVファイルの1つには、次のような属性があります。 "attribute with nested" quote ""
属性に引用符がネストされているため、パーサーは失敗します。
上記の問題を回避するには、ネストされた引用を次のようにエスケープします。 "attribute with nested" "" "quote" "" "" " =
これが問題を解決する1つの方法です。
引用符で囲まれていない入力に引用符を含むデータで、この同じエラーでこれに遭遇しました。つまり:
_some cell|this "cell" caused issues|other data
_
見つけるのは困難でしたが、 Apacheのドキュメント では、null
を値として取ることができるwithQuote()
メソッドに言及しています。
まったく同じエラーメッセージが表示されていたため、(ありがたいことに)この問題は修正されました。