2015-07-19 254 views
3

這裏是我的代碼:未定義的方法[]爲nil:NilClass(NoMethodError)在ruby中...爲什麼?

begin 
    items = CSV.read('somefile.csv') 
    linesAmount = CSV.readlines('somefile.csv').size 
    counter = 1 
    while linesAmount >= counter do 
     fullrow = items[counter] 
     firstitem = fullrow[0] #This is the line that my code doesn't like. 
     puts firstitem 
     counter = counter + 1 

    end 


end 

對於一些紅寶石不喜歡這一行,在那裏我有=與firstItem fullrow [0]。它引發了未定義的方法[]錯誤。但是,在控制檯中,我仍然可以看到它打印第一項...所以它仍然打印它,但仍然會引發錯誤?這是怎麼回事?但是,如果我將while循環的while循環的前三行放在while循環的外部,並註釋掉循環中除計數器行以外的所有內容,那麼我不會收到任何錯誤。因此,如果第一行項出現在while循環之外,代碼認爲它沒有問題。

編輯:我知道數組從0開始,但我特別想反擊,不關心第一行。我忘了提及那個,對不起。

編輯2:謝謝大家,我通過在linesAmount後面加-1來解決它,它起作用!

+0

數組在紅寶石是從零開始的。在'counter == linesAmount'上是'linesAmount + 1'行,'items [counter]'是可以預測的nil。因此'fullrow'是零,因此是一個錯誤。在控制檯中看到的是前一個循環的打印值。順便說一句,整個代碼看起來太麻煩了。 'items.each'在這裏更適合。 – mudasobwa

+0

不要在問題中提出答案。 –

回答

1

看起來你有一個錯誤,你正在閱讀物品數組的末尾。如果有10行的CSV文件,該線將與索引數組從0到9,而不是1到10

更改的,同時這個樣子

counter = 0 
while counter < linesAmount 
    ... 
end 

但更好的方法整體將只是做以下

CSV.readlines('somefile.csv').each do |line| 
    puts line 
end 
+0

condition'counter <= linesAmount'將運行0..10,仍然引發異常。 – BroiSatse

+1

你是對的,你到達的時間恰好是錯誤的,我認爲在我編輯糾正它之前大約20秒。 – Marc

1

CSV.readCSV.readlines返回數組。如果您的數組包含兩個值,則size返回2。但是您需要撥打的索引是items[0]和項目[1]。因此,此行

items[counter] 

將引發錯誤。

行更改爲

items[counter - 1] 

,它應該工作。

此外,您可以通過使用Ruby的成語提高代碼:

begin 
items = CSV.read('somefile.csv') 
items.each do |item| 
    puts item[0] 
end 
end 
相關問題