JAVA 中的 Opencsv 解析器,无法解析数据中的双引号

Opencsv parser in JAVA, unable to parse double quotes in the data

我有以下 csv 文件,

"id","Description","vale"
1,New"Account","val1"

我无法使用 opencsv jar 读取上述 csv 文件。它无法读取 New"Account,因为数据中有双引号。我的 csv reader 构造函数如下,

csvReader = new CSVReader(new FileReader(currentFile), ',', '\"', '[=12=]');

这是设计好的。您的构造函数将引号字符指定为 "\"",因此 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());
        }

    };

这是无效的 csv:

1,New"Account","val1"

应该是:

1,"New""Account","val1" -> 如果你想要 1 New"Account val1

1,"New""Account""","val1" -> 如果你想要 1 New"Account" val1

(引号)字段内的引号,必须用另一个引号转义。

虽然您可以更改代码以正确读取格式错误的 csv,但首先应修复 csv 数据,因为较大的 csv-files 或更新该数据可能会导致更多错误。

通常,当字段中有分隔符或其他引号时,会使用引号。因此,如果您忽略引号并仅在分隔符上拆分,那么在将来更新数据时如果字段内有分隔符就会出现问题 - 例如:

1,"John, Doe",123