导入CSV的Rails由于格式错误而失败

时间:2011-11-14 17:41:19

标签: ruby-on-rails ruby csv ruby-on-rails-3.1

当我尝试使用以下代码导入文件时,我得到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文件很大,有没有办法可以记录格式错误的行和 CONTINUE EXECUTION 和csv文件的其余部分?

2 个答案:

答案 0 :(得分:3)

您可以尝试自己处理文件,让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 :(得分:1)

使用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本身。