2017-01-30 5 views
0

Ich versuche, warum ich folgende Fehlermeldung erhalten bleiben, um herauszufinden: enter image description hereRubin nicht definierte Methode `[]‘ für nil: NilClass (NoMethodError) Fehler

Aus dem folgenden Code:

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 

Ich versuche grundsätzlich, zwei einzelne .csv-Dateien aufzunehmen und bestimmte Spalten zusammenzuführen. Ich habe zwei Arrays (file_contents und file_contents2), die die einzelnen csv-Dateien lesen und die Inhalte in Arrays speichern. Aus irgendeinem Grund erhalte ich einen Syntaxfehler für meine if-Anweisung. Ich hatte gehofft, jemand könnte mir helfen, herauszufinden, warum die if-Aussage, die ich geschrieben habe, nicht gültig ist. Ich dachte, es wäre so. Jede Hilfe wird geschätzt. Vielen Dank!

+1

können Sie bitte die Zeilennummern zeigen, welche eine Zeile: 27 –

+0

Sein Bruch in einem Ihrer 'file_contents [i] [5]' scheint wie 'file_contents [i]' Null irgendwo –

+0

Hallo jeder, Danke für die Hilfe! Ihr habt mir geholfen, es herauszufinden! Ich schätze es. – John123

Antwort

1

scheint, wie eine von file_contentsfile_contents2 oder leer ist.

Sie können die Schleife überspringen, wenn Sie auf, dass bestimmte Zeile den Fehler nicht erhöhen wollen.

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

Einer Ihrer Arrays file_contents oder file_contents2 könnte leer sein. Ausgabe sowohl, als auch Drucken file_contents[i][0] und file_contents2[x][0] vor Ihrer if Aussage.

Sie können eine einfache Änderung vornehmen, die funktionieren sollte:

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

Und eine Fehlerüberprüfung hinzu:

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 

Array Indizes laufen von 0 bis Länge − 1 in Rubin; Schleife in 0...arraysize stattdessen.

Wennfile_contents2[i] können oder sollten als file_contents2[x] geschrieben werden, können Sie nur eine Schleife über den Inhalt Arrays direkt:

for a in file_contents 
    for b in file_contents2 

und Scheiben verwenden, um aufeinander folgende Array-Elemente in ein anderes Array zu erhalten:

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 

und wenn Sie versuchen, die beiden Dateien Eins-zu-Eins zu verbinden, können Sie dies effizienter tun, indem Sie den Schlüssel in einen Hash setzen. Wahrscheinlich wollten Sie die Ausgabedatei nicht jedes Mal erneut öffnen.

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 
Verwandte Themen