【发布时间】:2015-04-28 08:26:52
【问题描述】:
我的 Rails 应用程序有类 Importer,我在其中使用方法导入 CSV 文件。
def import
CSV.foreach(file.path, headers: true, encoding: "iso-8859-1") do |row|
mail = row["email"]||row["Email"]||row["e-mail"]||row["E-mail"]||row["mail"]||row["Mail"]
end
end
我设置变量mail 在循环内执行操作,我尝试保护它免受邮件列的不同名称的影响,但我不知道应该如何打破循环并保持代码干燥,以防CSV 没有具有任何已定义标题的列。
编辑:
def import
header = nil
headers = CSV.open(file.path, encoding: "iso-8859-1") { |csv| csv.first }
headers.each { |e| header = e if e.downcase.gsub('-','')=~/^(|e)mail$/ }
if header != nil
CSV.foreach(file.path, headers: true, encoding: "iso-8859-1") do |row|
mail = row[header]
end
end
end
解决问题
【问题讨论】:
-
fail 'No email in input data' unless mail -
可以,但是单条记录没有email的时候会失败。
-
你声称你希望它“应该打破一个循环”。要简单地跳过记录,请使用
next if mail.nil? -
也许我描述错了。如果没有名为“email”、“Email”等的列,我想打破循环或者甚至不启动它。如果它会在定义的列中找到记录,我的邮件变量只是单个电子邮件,但如果没有列将始终为零。