将CSV文件导入数据库 - 拒绝某些行

时间:2013-08-08 18:06:26

标签: mysql ruby-on-rails sqlite csv

如果我想导入包含电子邮件列的csv文件,有没有办法 仅接受具有有效电子邮件格式的行并拒绝具有无效格式的行?

2 个答案:

答案 0 :(得分:0)

您可以在消化行时过滤行 我通常会解析CSV并生成和保存对象。 您可以使用标准验证进行过滤。

如果我的控制器有一个import操作并且需要一个csv_file参数,则控制器操作如下:

def import
  require "csv"
  if params[:csv_file].present?
    CSV.parse(File.open(params[:csv_file].tempfile){|f| f.read}, headers: true, header_converters: :symbol) do |row|
      obj = MyObject.new(row)
      obj.save # validation filter rows
    end
  end
end

并在您的模型中

validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i

答案 1 :(得分:0)

在处理行之前,您可以使用正则表达式匹配列内容,例如:

CSV.foreach(path_to_file, :headers => true) do |row|
  if /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/.match(row['email'])
     #process the row (e.g. insert into database)
  end
end