如果我想导入包含电子邮件列的csv文件,有没有办法 仅接受具有有效电子邮件格式的行并拒绝具有无效格式的行?
答案 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