Рельсы, импортирующие CSV, терпят неудачу из-за неправильного формирования - PullRequest
3 голосов
/ 14 ноября 2011

Я получаю CSV:MalFormedCSVError, когда пытаюсь импортировать файл, используя следующий код:

  def import_csv(filename, model)
    CSV.foreach(filename, :headers => true) do |row|
      item = {}
      row.to_hash.each_pair do |k,v|
          item.merge!({k.downcase => v})
      end
        model.create!(item)
    end
  end

CSV-файлы ОГРОМНЫ, поэтому есть ли способ, которым я могу просто записать неправильно отформатированные строки и ПРОДОЛЖИТЬ ИСПОЛНЕНИЕ с остатком файла CSV?

Ответы [ 2 ]

3 голосов
/ 14 ноября 2011

Вы можете попробовать обработать чтение файла самостоятельно и позволить CSV работать по одной строке за раз. Примерно так:

File.foreach(filename) do |line|
  begin
    CSV.parse(line) do |row|
      # Do something with row...
    end
  rescue CSV::MalformedCSVError => e
    # complain about line
  end
end

Конечно, вам придется что-то делать со строкой заголовка. Кроме того, это не сработает, если в CSV встроены новые строки.

1 голос
/ 26 апреля 2017

Одна проблема с использованием File для ручного просмотра каждой строки в файле состоит в том, что файлы CSV могут содержать поля с \n (символом новой строки) в них. File примет это для обозначения новой строки, и в итоге вы попытаетесь разобрать частичную строку.

Вот еще один подход, который может работать для вас:

@csv = CSV.new('path/to/file.csv')

loop do
  begin
    row = @csv.shift
    break unless row
    # do stuff
  rescue CSV::MalformedCSVError => error
    # handle the error
    next
  end
end

Основным недостатком этого подхода является то, что при обработке ошибки у вас нет доступа к строке строки CSV, только к самому CSV::MalformedCSVError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...