2015-01-07 14 views
9

Ich habe ein Ruby-Skript, das zwei Dateien erstellt, indem Sie Werte aus einer anderen Datei nehmen und zusammenführen.keine implizite Umwandlung von Nil in String Fehler

#Resources 
require 'rubygems' 
require 'csv' 

col_date = [] 
col_constant1 = [] 
col_constant2 = [] 
col_appYear = [] 
col_statsDesc = [] 
col_keyStats =[] 
col_weeklyTotal=[] 


weekly_total = [] 

fname = "finalStats.csv" #variable for capture file 
     finalStatsFile = File.open(fname, "w") #write to capture file 
fname2 = "weeklyStats.csv" 
     weeklyStatsFile = File.open(fname2, "w")  
CSV.foreach('compareData.csv', converters: :numeric) do |row| 
    weekly_total << row[0] - row[1] 

    weekly_total.each do |data| 
    data << weekly_total.shift 
    weeklyStatsFile.puts data 
end 
end 

#retrieve stats from original document 
CSV.foreach("autoCapture.csv") {|row| col_date << row[0]} 
CSV.foreach("autoCapture.csv") {|row| col_constant1 << row[1]} 
CSV.foreach("autoCapture.csv") {|row| col_appYear << row[2]} 
CSV.foreach("autoCapture.csv") {|row| col_statsDesc << row[3]} 
CSV.foreach("autoCapture.csv") {|row| col_constant2 << row[4]} 
CSV.foreach("autoCapture.csv") {|row| col_keyStats << row[5]} 
CSV.foreach("weeklyStats.csv") {|row| col_weeklyTotal << row[0]} 



    col_date.zip(col_constant1, col_appYear, col_statsDesc, col_constant2, col_keyStats, col_weeklyTotal).each do |col_date, col_constant1, col_appYear, col_statsDesc, col_constant2, 
    col_keyStats, col_weeklyTotal| 

    finalStatsFile.puts col_date+", "+col_constant1+", "+ col_appYear+", "+col_statsDesc+", "+col_constant2+", "+col_keyStats+", "+col_weeklyTotal 

end 

In einer Datei Ich mag die Werte in der Zeile [1] aus den Werten in der Zeile [0] subtrahieren, um einen neuen ‚weekly_total‘ Wert zu schaffen. Ich gebe dann dieses Array von Werten in einer Datei namens weeklyStats.csv aus. Dies wird eine Spalte von Werten in Ordnung ausgeben.

Allerdings mag ich diese Werte mit einem anderen Satz aus einer anderen Datei (autoCapture.csv) beizutreten, und wenn ich versuche, sie als Arrays zip, so dass sie über lesen Reihen in entsprechenden erhalte ich die Fehlermeldung:

weeklyStats_csv.rb:42:in `+': no implicit conversion of nil into String (TypeError) 
    from weeklyStats_csv.rb:42:in `block in <main>' 
    from weeklyStats_csv.rb:40:in `each' 
    from weeklyStats_csv.rb:40:in `<main>' 

Ich nehme an, dies bedeutet, dass das Array Zip keine Ausnahme abfangen wird, wenn der eine der Werte Null ist und daher nicht in eine Zeichenfolge konvertiert werden kann. Das Problem ist, ich habe versucht, wöchentliche_total in String und Array zu konvertieren, da ich dachte, dass es das Problem sein kann (ein Mismatch von Typen), aber ich nicht nur, wo ich von hier aus gehen soll. Kann jemand helfen?

+0

Entfernen Endbalkens von 'col_weeklyTotal |' in Zeile 42. – mudasobwa

+0

Danke für die Rückmeldung an mich. Leider hat das nicht funktioniert, ich denke ich brauche das um die Variablen (in diesem Fall Arrays) zu umschließen, die der Sammlung –

+0

zugeordnet sind. Ah, Entschuldigung, ich wusste nicht, dass diese Teile Teil der vorherigen Zeichenfolge sind. Dann entfernen Sie einfach Wagenrücklauf von der vorherigen Zeile. – mudasobwa

Antwort

12

Einer (oder mehr) Werte in Zeichenfolge

finalStatsFile.puts col_date+", "+col_constant1+", "+ col_appYear+", "+col_statsDesc+", "+col_constant2+", "+col_keyStats+", "+col_weeklyTotal 

wurde nil. Um die Ausgabe zu beheben, sollten Sie explizit auf Strings Stimmen:

finalStatsFile.puts col_date.to_s + ", " + 
        col_constant1.to_s + ", " + 
        col_appYear.to_s + ", " + 
        col_statsDesc.to_s + ", " + 
        col_constant2.to_s + ", " + 
        col_keyStats.to_s + ", " + 
        col_weeklyTotal.to_s 

BTW, könnte die ganze Klausel in mehr rubyish Weise neu geschrieben werden:

finalStatsFile.puts [ col_date, 
         col_constant1, 
         col_appYear, 
         col_statsDesc, 
         col_constant2, 
         col_keyStats, 
         col_weeklyTotal ].map(&:to_s).join(', ') 
+0

Ich denke, Sie haben Recht mit dem Nullwert, aber leider gestoppt .to_s den Fehler aufgetreten, aber die Spalte noch nicht in die Datei schreiben. Ich habe das Gefühl, dass das Problem mit + nil.to_s expliziter Konvertierung behoben werden kann, aber ich habe das in den .puts versucht und es hat immer noch nicht funktioniert. Ich änderte auch die wöchentliche Summe. Jeder tun zu CSV.foreach ('compareData.csv', Konverter:: numerisch) do | row | \t wöchentlich_total << Reihe [0] - Reihe [1] \t Ende \t weekly_total.each do | i | \t weeklyStatsFile.puts i Ende ohne Ergebnis :( –

+2

Hey danke, ich habe das jetzt behoben. Die .to_s funktionierte am Ende, es war nur, dass ich die Variable weekly_total zuerst in eine separate Datei legte und versuchte zu lesen der Wert zurück. Ich tat dies, weil ich nicht wusste über die Umwandlung in String zunächst und ich dachte, dass würde es beheben. Wie auch immer, sobald ich die andere Datei verließ, funktionierte Ihre Antwort. Prost! –

+0

Sie könnten auch '.compact' auf der Array, um alle Nils zu entfernen: '[...] .compact.join (',')' –