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