0

您好我正在尝试读取 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

但我完全确定 row[3] 和 row[5] 不是零,知道为什么会这样吗?提前致谢!

4

1 回答 1

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 行 nil 值就可以破坏整个脚本。

您还在对第 3 行和第 5 行进行硬编码。也许您的意思是不同的行?尝试测试以确保该行与您认为它在 IRB 中的完全相同。你能告诉我们什么 row[3] 和 row[5] 相等吗?

于 2012-11-16T14:08:26.273 回答