我有以下csv文件,
"id","Description","vale"
1,New"Account","val1"
我无法使用opencsv jar读取上述csv文件。它无法读取New"Account
,因为数据内部有双引号。我的csv阅读器构造函数正在关注,
csvReader = new CSVReader(new FileReader(currentFile), ',', '\"', '\0');
答案 0 :(得分:2)
这是无效的csv:
1,New"Account","val1"
应该是:
1,"New""Account","val1"
- >如果你想要1 New"Account val1
或
1,"New""Account""","val1"
- >如果你想要1 New"Account" val1
引号内(引用)字段必须使用其他引号进行转义。
虽然您可以更改代码以正确读取格式错误的csv,但首先应修复csv数据,因为您可能会使用更大的csv文件或更新该数据来获取更多错误。
通常,当字段内有分隔符或其他引号时,会使用引号。因此,如果您忽略引号并仅在分隔符上拆分,则在将来更新数据时字段内存在分隔符时会出现问题 - 例如:
1,"John, Doe",123
答案 1 :(得分:1)
这是设计的。您的构造函数将引号字符指定为"\""
,因此OpenCSV
会将该字符视为引号字符,即当它读取引号时,它将忽略所有逗号,直到找到匹配的引号。
要解决此问题,您可以使用FilterReader
。
Reader reader = new FilterReader(fileReader) {
private int filter(int ch) {
return ch == '"'?' ':ch;
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
int red = super.read(cbuf, off, len);
for ( int i = off; i < off + red; i++) {
cbuf[i] = (char)filter(cbuf[i]);
}
return red;
}
@Override
public int read() throws IOException {
return filter(super.read());
}
};