OpenCsv读取文件与转义分隔符

时间:2015-09-18 04:56:48

标签: csv escaping opencsv

我正在使用opencsv 2.3,它似乎并没有像我期望的那样处理转义字符。我需要能够处理不使用引号字符的CSV文件中的转义分隔符。

示例测试代码:

CSVReader reader = new CSVReader(new FileReader("D:/Temp/test.csv"), ',', '"', '\\');
String[] nextLine;
while ((nextLine = reader.readNext()) != null) {
    for (String string : nextLine) {
        System.out.println("Field [" + string + "].");
    }
}

和csv文件:

first field,second\,field

和输出:

Field [first field].
Field [second].
Field [field].

请注意,如果我将csv更改为

first field,"second\,field"

然后我得到了我想要的输出:

Field [first field].
Field [second,field].

但是,在我的情况下,我没有选择修改源CSV。

1 个答案:

答案 0 :(得分:4)

不幸的是,看起来opencsv不支持转义分隔符,除非它们用引号括起来。遇到转义字符时,会调用以下方法(取自opencsv的源代码)。

protected boolean isNextCharacterEscapable(String nextLine, boolean inQuotes, int i) {
    return inQuotes  // we are in quotes, therefore there can be escaped quotes in here.
            && nextLine.length() > (i + 1)  // there is indeed another character to check.
            && (nextLine.charAt(i + 1) == quotechar || nextLine.charAt(i + 1) == this.escape);
}

如您所见,如果转义字符后面的字符是引号字符或另一个转义字符,则此方法仅返回true。你可以修补这个库,但是以它目前的形式,它不会让你做你想做的事情。