Groovy OpenCSV читает значение с обратной косой чертой (например, & ldquo; домен \ пользователь & rdquo;)

while condition is True: 
  stuff()
else:
  stuff()
1
задан sfgroups 18 January 2019 в 00:42
поделиться

1 ответ

В версии 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-символа в соответствии с официальной документацией

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

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

0
ответ дан Dmitry Khamitov 18 January 2019 в 00:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: