2011-03-03 84 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

相关问题