Как пропустить / игнорировать неправильно сформированный CSV при использовании CSV.foreach? - PullRequest
0 голосов
/ 09 ноября 2019

Я пытался прочитать большой CSV-файл

, но CSV находится в плохом состоянии

, поэтому некоторые из его строк бросают CSV::MalformedCSVError

Я просто хочу игнорироватьстрока ошибки и перейти к следующей строке

Я пытался добавить функцию начала восстановления, но, похоже, мой код не работает, он остановился с ошибкой

мой текущий код

require 'csv'    

begin
  CSV.foreach(filename, :headers => true) do |row|
    Moulding.create!(row.to_hash)
  end
rescue
  next
end

1 Ответ

1 голос
/ 09 ноября 2019

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

require 'csv'    

csv_file = CSV.open("test.csv", :headers => true)
loop do
    begin
      row = csv_file.shift
      break unless row 
      p row
    rescue CSV::MalformedCSVError
      puts "skipping bad row"
    end
end

Кстати, ваш код выше не запускается, потому что когда вы переместили begin rescue, чтобы окружить метод foreach, next больше не действителен в этом контексте. Закомментируя оператор next, код выполняется, но когда в методе foreach вызывается исключение, метод просто завершается, и программа переходит к блоку спасения и больше не считывает строки из файла.

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