【发布时间】:2013-08-08 18:06:25
【问题描述】:
如果我想导入一个包含电子邮件列的 csv 文件,有没有办法 只接受具有有效电子邮件格式的行并拒绝具有无效格式的行?
【问题讨论】:
标签: mysql ruby-on-rails sqlite csv
如果我想导入一个包含电子邮件列的 csv 文件,有没有办法 只接受具有有效电子邮件格式的行并拒绝具有无效格式的行?
【问题讨论】:
标签: mysql ruby-on-rails sqlite csv
您可以在消化行时过滤它们。
我通常解析 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
【讨论】:
您可以在处理行之前使用正则表达式匹配列内容,例如:
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
【讨论】: