CSV.read Неверное цитирование в строке x

Я использую ruby ​​CSV.read с массивными данными. Время от времени библиотека встречает плохо отформатированные строки, например:

"Illegal quoting in line 53657."

Проще было бы проигнорировать строку и пропустить ее, а затем пройти через каждый CSV и исправить форматирование. Как я могу это сделать?

3 ответа

Решение

У меня была эта проблема в строке, как 123,456,a"b"c

Проблема в том, что парсер CSV ожидает ", если они появляются, чтобы полностью окружить разделенный запятыми текст.

Решение использовать символ кавычки помимо " что я был уверен, что не появится в моих данных:

CSV.read(filename, :quote_char => "|")

liberal_parsing опция доступна начиная с версии Ruby 2.4 для подобных случаев. Из документации:

Когда установлено истинное значение, CSV будет пытаться анализировать ввод, не соответствующий RFC 4180, такой как двойные кавычки в полях без кавычек.

Чтобы включить его, передайте его в качестве опции методу CSV read/parse/new:

CSV.read(filename, liberal_parsing: true)

Не позволяйте CSV читать и анализировать файл.

Просто прочитайте файл и передайте каждую строку CSV.parse_line, а потом rescue любые исключения это бросает.

Попробуйте использовать двойные кавычки " как цитата char:

require 'csv'
CSV.foreach(file,{headers: :first_row, quote_char: "\x00"}) do |line|
  p line
end

По-видимому, эта ошибка также может быть вызвана непечатаемыми символами спецификации. В этом потоке предлагается использовать файловый режим для принудительного преобразования, что в конечном итоге сработало для меня.

require 'csv'

CSV.open(@filename, 'r:bom|utf-8') do |csv|
  # do something
end
Другие вопросы по тегам