Ruby undefined方法`[]' for nil:NilClass(NoMethodError)错误

时间:2017-01-30 05:36:38

标签: ruby-on-rails ruby csv

我试图弄清楚为什么我一直收到以下错误: enter image description here

从以下代码:

source 'https://rubygems.org'

我基本上试图获取两个单独的.csv文件并将某些列合并在一起。我有两个数组(file_contents和file_contents2)正在读取各个csv文件并将内容存储在数组中。出于某种原因,我的if语句出现语法错误。我希望有人可以帮我弄清楚为什么我写的if语句不是有效的。我想是的。任何帮助表示赞赏。谢谢!

3 个答案:

答案 0 :(得分:1)

您的某个阵列file_contentsfile_contents2可能为空。输出两者,以及在file_contents[i][0]声明之前打印file_contents2[x][0]if

您可以进行一项应该有效的简单更改:

for i in 0..arraysize for x in 0..arraysize1

并添加错误检查:

if !file_contents[i].blank? and !file_contents2[x].blank? and file_contents[i][0] == file_contents2[x][0]

答案 1 :(得分:1)

for i in 1..arraysize
  for x in 1..arraysize1

数组索引在Ruby中从0运行到length - 1;转而使用0...arraysize

如果 file_contents2[i]可以或应该写为file_contents2[x],您可以直接循环遍历数组的内容:

for a in file_contents
  for b in file_contents2

并使用切片将连续的数组元素放入另一个数组中:

def information_transfer()
  file_contents = CSV.read("test.csv", col_sep: ",", encoding: "ISO8859-1")
  file_contents2 = CSV.read("applicantinfo.csv", col_sep: ",", encoding: "ISO8859-1")
  for a in file_contents
    for b in file_contents2
      if a[0] == b[0]
        CSV.open("language_output.csv", "wb") do |csv|
          csv << a[0..18] + b[24..33]
        end
      end
    end
  end
end

如果您尝试一对一地加入这两个文件,则可以通过将密钥放入哈希来更有效地执行此操作。您也可能并不是每次都重新打开输出文件。

def information_transfer()
  file_contents = CSV.read("test.csv", col_sep: ",", encoding: "ISO8859-1")
  file_contents2 = CSV.read("applicantinfo.csv", col_sep: ",", encoding: "ISO8859-1")

  h = Hash[file_contents.collect { |row| [row[0], row] }]

  CSV.open("language_output.csv", "wb") do |csv|
    for b in file_contents2
      a = h[b[0]]
      csv << a[0..18] + b[24..33]
    end
  end
end

答案 2 :(得分:1)

似乎file_contentsfile_contents2中的一个是空的。

如果您不想在该特定行上引发错误,则可以跳过循环。

next if file_contents[i].blank? || file_contents2[i].blank?
if file_contents[i][0] == file_contents2[x][0]