使用CSV.foreach时如何跳过/忽略格式错误的CSV?

我试图读取大型的CSV文件

但是csv状况不佳

所以其中有些是行CSV::MalformedCSVError

我只想忽略错误行并移至下一行

我尝试添加开始救援,但似乎我的代码无法正常工作,并在错误处停止了

我当前的代码

require 'csv'    

begin
  CSV.foreach(filename,:headers => true) do |row|
    Moulding.create!(row.to_hash)
  end
rescue
  next
end
cj130555 回答:使用CSV.foreach时如何跳过/忽略格式错误的CSV?

我认为您无法使用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方法中引发异常时,该方法仅结束并且程序移至救援块,并且不再从文件中读取任何行。

本文链接:https://www.f2er.com/3132744.html

大家都在问