【问题标题】:how to skip/ignore malformed CSV when using CSV.foreach?使用 CSV.foreach 时如何跳过/忽略格式错误的 CSV?
【发布时间】:2019-11-09 13:28:58
【问题描述】:

我试图读取大的 csv 文件

但 csv 状况不佳

所以其中一些是抛线CSV::MalformedCSVError

我只想忽略错误行并转到下一行

我尝试添加开始救援,但似乎我的代码不起作用,它在错误处停止

我当前的代码

require 'csv'    

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

【问题讨论】:

  • 在不知道文件长什么样的情况下无法回答您的问题。我建议您尝试使用仅包含几行的文件来重现错误,然后将这些行连同获得的错误消息以及引发异常的行的标识一起发布。
  • 如果您需要查看文件,那么我正在尝试做的事情是不可能的吗?那么正确的方法是修改/修复 csv 文件?我的错误是这样的CSV::MalformedCSVError (Unquoted fields do not allow new line <"\r"> in line 10250.)

标签: ruby-on-rails ruby csv


【解决方案1】:

我认为您不能使用 foreach 方法来做到这一点,因为异常似乎不是在块内引发,而是在 foreach 方法本身内引发,但这样的事情应该可以工作。在这种情况下,调用 shift 时会引发异常,然后您可以从中解救出来。

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 方法中引发异常时,该方法刚刚结束并且程序继续到救援块并且不再从文件中读取任何行。

【讨论】:

猜你喜欢
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 2016-09-20
  • 2020-06-17
  • 2020-05-18
相关资源
最近更新 更多