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?

値がnilでないことは確かだとあなたは言いますが、それはまさにエラーが言っていることです。スクリプト全体を壊すのに必要なのは、nil値の1行だけです。

また、行3と5をハードコーディングしています。おそらく、異なる行を意味しますか?テストして、行がIRBにあると思うものと正確に一致していることを確認してください。行[3]と行[5]が等しいことを教えてください。

于 2012-11-16T14:08:26.273 に答える