2017-01-30 13 views
0

私は、次のようなエラーになっておく理由を把握しようとしている:ルビー未定義のメソッド `[]」nilのために:NilClass(NoMethodError)エラー

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") 
    arraysize = file_contents.length 
    arraysize1 = file_contents2.length 
    for i in 1..arraysize 
    for x in 1..arraysize1 
     if file_contents[i][0] == file_contents2[x][0] 
     CSV.open("language_output.csv", "wb") do |csv| 
      csv << [file_contents[i][0], file_contents[i][1], file_contents[i][2],file_contents[i][3], file_contents[i][4], 
      file_contents[i][5], file_contents[i][6], file_contents[i][7], file_contents[i][8],file_contents[i][9], 
      file_contents[i][10], file_contents[i][11], file_contents[i][12], file_contents[i][13], file_contents[i][14], 
      file_contents[i][15], file_contents[i][16], file_contents[i][17], file_contents[i][18], file_contents2[i][24],file_contents2[i][25], 
      file_contents2[i][26],file_contents2[i][27], file_contents2[i][28], file_contents2[i][29], file_contents2[i][30], file_contents2[i][31], file_contents2[i][32], file_contents2[i][33]] 
     end 
    end 
    end 
end 
end 
:次のコードから enter image description here

私は基本的に2つの個別の.csvファイルをとり、特定の列を一緒にマージしようとしています。私は2つの配列(file_contentsとfile_contents2)を持っていて、個々のcsvファイルを読み込んでいて、内容を配列に格納しています。何らかの理由で、if文の構文エラーが発生します。誰かが私が書いたif文がなぜ有効でないのか理解できるように助けてくれることを願っていました。私はそれがあると思った。どんな助けもありがとうございます。ありがとう!

+1

使用すると、1つの行である行番号を指すしてくださいすることができます:あなた 'file_contentsの1で27 –

+0

その破壊を[I] [5]' 'file_contentsのように思える[i]は'、どこか –

+0

こんにちは皆nilでありますすべての助けてくれてありがとう!皆さん、私はそれを理解するのを手伝ってくれました!それは有り難いです。 – John123

答えて

1

file_contents又はfile_contents2の一方が空であるように思えます。

特定の行でエラーを発生させたくない場合は、ループをスキップできます。

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

file_contentsまたはfile_contents2のいずれかが空である可能性があります。両方とも出力し、ifの文の前にfile_contents[i][0]file_contents2[x][0]と印刷します。

あなたは動作するはずです簡単な変更することができます:

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
for i in 1..arraysize 
    for x in 1..arraysize1 

配列のインデックスは長さ− 0から1に実行をRubyで代わりに0...arraysizeにループしてください。

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 
file_contents2[i]がまたは file_contents2[x]のように記述しなければならない可能

場合は、あなただけの直接配列の内容をループすることができます

2つのファイルを1対1で結合しようとしている場合は、キーをハッシュにすることでより効率的に行うことができます。また、毎回出力ファイルを再度開くことを意味しているとは限りません。

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 
関連する問題