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

时间:2015-12-29 09:46:44

标签: java csv opencsv

我有以下csv文件,

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

我无法使用opencsv jar读取上述csv文件。它无法读取New"Account,因为数据内部有双引号。我的csv阅读器构造函数正在关注,

csvReader = new CSVReader(new FileReader(currentFile), ',', '\"', '\0');

2 个答案:

答案 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());
        }

    };