Файл чтения OpenCsv с экранированным разделителем

Я использую opencsv 2.3, и он не имеет дело с escape-символами, как я ожидаю. Мне нужно иметь возможность обрабатывать экранированный разделитель в файле 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 ответ

Решение

К сожалению, похоже, что opencsv не поддерживает экранирование символов-разделителей, если они не в кавычках. Следующий метод (взятый из исходного кода opencsv) вызывается при обнаружении escape-символа.

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, только если символ, следующий за escape-символом, является кавычкой или другим escape-символом. Вы можете подключить библиотеку к этому, но в ее нынешнем виде она не позволит вам делать то, что вы пытаетесь сделать.

Другие вопросы по тегам