您好我正在尝试阅读csv文件,我的代码是这样的:
CSV.foreach(path, {:col_sep => @seperator}) do |row|
#CSV.foreach(File.basename(path), {:col_sep => @seperator}) do |row|
r = Route.new
r.contact_id = contact_id
r.name = row[0]
r.number_range = row[1]
r.rate = row[3].gsub(",", ".").to_f
r.valid_from = DateTime.strptime(row[5], @time_format)
r.currency = @currency
r.save
end
我在这方面遇到了问题:
r.rate = row[3].gsub(",", ".").to_f
r.valid_from = DateTime.strptime(row[5], @time_format)
我收到错误:undefined method 'gsub' for nil:NilClass
和
undefined method `strptime' for nil:NilClass
但是我完全确定第[3]行和第5行没有任何关于它为什么会发生的任何想法?提前谢谢!
答案 0 :(得分:0)
.gsub()是一个String方法,所以只有当row [3]值是一个字符串时它才会起作用。看来你的一些行是零。为避免这种情况,您可以为nil值添加一个简单的检查器
r.rate = row[3].gsub(",",".").to_f if row[3].nil?
下一行再次出现相同的错误。所以你可以把它改成:
r.valid_from = DateTime.strptime(row[5], @time_format) if row[5].nil?
你说你确定这些值不是零,但这正是错误所说的。它只需要1行和一个零值来打破整个脚本。
你也在对第3行和第5行进行硬编码。也许你的意思是不同的行?尝试测试以确保该行与您在IRB中的确切等同。你能告诉我们什么行[3]和行[5]相等吗?