【问题标题】:Ruby: Why is there a `nil` at the end of all the strings in my array?Ruby:为什么我的数组中所有字符串的末尾都有一个“nil”?
【发布时间】:2011-07-08 04:50:35
【问题描述】:

所以我用 Ruby 编写了一些代码来将文本文件拆分为单独的行,然后根据分隔符对这些行进行分组。然后将此输出写入一个数组,该数组被传递给一个方法,该方法将 HTML 输出到一个文本文件中。当我尝试以不同的方法使用 gsub 将 HTML 文本文件中的占位符替换为 record 数组中的值时,我开始遇到问题 - 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
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|

这是我一直在测试的代码的 sn-p:

# 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

当该代码运行时,我得到以下输出:

john@starfire:~/code/ruby/idealm_db_parser$ ruby putsarray.rb
26188
String
nil
NilClass

...这意味着record 中的每个数组位置显然都有String 类型的数据 类型nil 的数据。这是为什么?

【问题讨论】:

  • file_as_string(fn) 可以简单地为File.read(fn)。您也可以省略Array.new 的两行。

标签: ruby arrays string null


【解决方案1】:

您的database_array 的维度比您想象的要多。

你的节结束标记,|--|--|...|--| 后面有一个换行符。所以,file_as_string 返回如下内容:

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

然后是 split() 在节的末尾变成这样的:

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

然后您再次拆分,但"\n".split("\n") 给出了一个空数组,其中第一个元素返回为nil

【讨论】:

  • 你知道,我有一种感觉与它有关。快速解决方法是迭代除最后一个元素之外的每个元素吗?我该怎么做?
  • @kivetros:快速解决方法是检查record.empty?
  • @kivetros,我认为最快的解决方法是在拆分期间为您的节结尾标记添加换行符。也就是说,content.split("|--| ... |--|\n") 然后database_array 应该只包含您的记录,而不能包含杂散的独立换行符。
  • 这很优雅......我将在几分钟内重构这个脚本 - 我会试一试并让你知道!谢谢!
猜你喜欢
  • 2019-10-13
  • 2012-12-18
  • 2017-06-29
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多