Groovy OpenCSV читает значение с обратной косой чертой (например, «домен \ пользователь») - PullRequest
0 голосов
/ 15 января 2019

В Groovy я использую opencsv для разбора файла CSV. мой код не обрабатывает значение с обратной косой чертой.

мой входной файл имеет это значение

value1,domain\user,value2

Вот мой отличный код.

   def filename = 'C:\\Temp\\list.txt'
    CSVReader csvReader = new CSVReader(new FileReader(filename))
    String[] nextRecord       
    while ((nextRecord = csvReader.readNext()) != null) {
        println nextRecord
    }
    csvReader.close()

выводит значение без обратной косой черты для второго поля.

[value1, domainuser, value2]

Как обработать значение обратной косой черты в OpenCSV?

спасибо SR

============= Apache Common parser работал.

Iterable<CSVRecord> records = CSVFormat.EXCEL.parse(new FileReader(filename));
for (CSVRecord record : records) {
    String f1 = record.get(0);
    String f2 = record.get(1);
    String f3 = record.get(2);
    println f1
    println f2
    println f3
}

1 Ответ

0 голосов
/ 17 января 2019

В версии 3.9, opencsv представил еще один парсер, помимо CSVParser. Парсер лежит в основе CSVReader. Этот новый парсер называется RFC4180Parser. Как официальная документация гласит

RFC4180 определяет стандарт для всех самых мелких вопросов, касающихся точности форматирования файлов CSV ...

Основное различие между CSVParser и RFC4180Parser состоит в том, что CSVParser использует escape-символ для обозначения «непечатных» символов, в то время как спецификация RFC4180 принимает все символы между первой и последней цитатой как евангелие (за исключением двойной кавычки) который избежал двойной кавычки).

Так что попробуйте использовать opencsv 3.9+ и RFC4180Parser. У меня работает

def parser = new RFC4180ParserBuilder().build()
def reader = new CSVReaderBuilder(new FileReader(filename)).withCSVParser(parser).build();
println reader.readNext()

Выход:

[value1, domain\user, value2]

Если по какой-то причине вы не можете использовать версию 3.9 и выше, вы можете настроить старый синтаксический анализатор так, чтобы escape-символ представлял собой другой символ, а не обратную косую черту. Но в этом случае существует риск вырвать другие строки из файла, если создатель исходного файла использует обратную косую черту в качестве escape-символа в соответствии с официальной документацией

... Иногда символ-разделитель включается в данные для самого поля, поэтому символы кавычек необходимы. Эти кавычки также могут быть включены в данные, поэтому необходим экранирующий символ ...

Поэтому я предлагаю использовать версию 3.9+ и RFC4180Parser

...