2011-03-03 78 views
0

所以我在Ruby中編寫了一些代碼將文本文件分割成單獨的行,然後根據分隔符對這些行進行分組。然後將此輸出寫入一個數組,該數組傳遞給一個方法,該方法將HTML分成一個文本文件。當我嘗試在不同的方法中使用gsub替換HTML文本文件中的佔位符時,我開始遇到問題,它使用record數組中的值 - Ruby不斷告訴我傳遞了nil值。在試圖調試該程序的幾小時後,我決定尋找其他地方,並且我認爲我正在做一些事情。該程序的修改版本在下面發佈。Ruby:爲什麼我的數組中所有字符串的末尾都有`nil`?

這裏是輸入文本文件的樣本:

26188 
WHL 
1 
Delco 

B-7101 
A-63 
208-220/440 
3 
285 w/o pallet 
1495.00 

C:/img_converted/26188B.jpg 
EDM Machine Part 2 of 3 
AC Motor, 3/4 Hp, Frame 182, 1160 RPM 
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--| 

下面是代碼的片段,我一直在測試:

# function to import file as a string 

def file_as_string(filename) 
    data = '' 
    f = File.open(filename, "r") 
    f.each_line do |line| 
    data += line 
end 
return data 
end 

Dir.glob("single_listing.jma") do |filename| 
content = file_as_string(filename) 
content = content.gsub(/\t/, "\n") 
database_array = Array.new 
database_array = content.split("|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|") 
for i in database_array do 
    record = Array.new 
    record = i.split("\n") 
    puts record[0] 
    puts record[0].class  end 
end 

當該代碼運行,我得到這樣的輸出:

[email protected]:~/code/ruby/idealm_db_parser$ ruby putsarray.rb 
26188 
String 
nil 
NilClass 

...這意味着,在record各陣列位置顯然有數據類型String類型nil。爲什麼是這樣?

+0

'file_as_string(fn)'可以簡單地寫成'File.read(fn)'。你也可以省略兩行說'Array.new'。 – pilcrow 2011-03-03 16:50:06

+0

啊,好的。謝謝。 – eckza 2011-03-03 17:29:05

回答

2

您的database_array具有比您想象的更多維度。

您的結尾標記,|--|--|...|--|後面有一個換行符。所以,file_as_string回報是這樣的:

"26188\nWHL...|--|--|\n" 

,並在結束節則split()弄成這個樣子:

["26188\nWHL...1160 RPM\n", "\n"] # <---- Note the last element here! 

你然後再拆分每個,但"\n".split("\n")給出了一個空數組,其第一個元素返回爲nil

+0

你知道,我有一種感覺與它有關。快速修復是否會迭代每一個元素,但最後?我會怎麼做? – eckza 2011-03-03 16:51:51

+0

@kivetros:快速修復將檢查'record.empty?'。 – Chuck 2011-03-03 17:01:44

+0

更好:快速修復最終會檢查'if record [14]!= nil' ... – eckza 2011-03-03 17:13:03

相關問題