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