0

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

4

2 回答 2

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
于 2013-08-08T18:29:20.967 回答
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
于 2013-08-08T18:37:14.443 回答