2015-01-07 14 views
9

Ho uno script ruby ​​che creerà due file prendendo e unendo i valori di un altro file.nessuna conversione implicita di nil nell'errore di stringa

#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 un file desidero sottrarre i valori nella riga [1] dai valori nella riga [0] per creare un nuovo valore 'weekly_total'. Quindi, emetto questa matrice di valori in un file chiamato weeklyStats.csv. Questo produrrà una colonna di valori fini.

Tuttavia, voglio unire questi valori con un altro set da un altro file (autoCapture.csv) e quando provo a zip loro come gli array in modo che leggono tutto in righe corrispondenti ottengo l'errore:

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>' 

Questo significa che l'array zip non cattura un'eccezione se uno dei valori è nullo e quindi non può essere convertito in stringa. Il problema è che ho provato a convertire settiman_total in stringa e array come pensavo che potesse essere il problema (una mancata corrispondenza di tipi) ma non so dove andare da qui. Qualcuno può aiutare?

+0

Rimuovere la barra posteriore da 'col_weeklyTotal |' in linea 42. – mudasobwa

+0

Grazie per essere tornato da me. Sfortunatamente non ha funzionato, penso di averne bisogno | per racchiudere le variabili (in questo caso le matrici) associate alla collezione –

+0

Ah, scusa, non mi sono reso conto che quelle fanno parte della stringa precedente. Quindi rimuovere semplicemente il ritorno a capo dalla riga precedente. – mudasobwa

risposta

12

Uno (o più) dei valori di stringa

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

divennero nil. Per fissare l'uscita li si dovrebbe lanciare esplicitamente alle stringhe:

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, l'intera clausola potrebbe essere riscritto in modo più rubyish:

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

Penso che tu abbia ragione sul valore nullo ma sfortunatamente il .to_s ha fermato l'errore ma la colonna non ha ancora scritto sul file. Ho la sensazione che il problema possa essere risolto con la conversione esplicita + nil.to_s, ma l'ho provato in .puts e ancora non ha funzionato. Ho anche cambiato il suo totale settimanale .each to CSV.foreach ('compareData.csv', converters:: numerico) do | row | \t weekly_total << riga [0] - riga [1] \t fine \t weekly_total.each do | i | \t weekStatsFile.puts i fine senza risultato :( –

+2

Hey grazie, ho risolto questo ora. Il .to_s ha funzionato alla fine, era solo che stavo mettendo la variabile weekly_total in un file separato prima e cercando di leggere il valore è tornato, l'ho fatto perché inizialmente non conoscevo la conversione in stringa e pensavo che avrebbe risolto il problema, comunque una volta che ho abbandonato l'altro file, la tua risposta ha funzionato ... saluti! –

+0

Puoi anche usare '.compact' sul array per rimuovere qualsiasi nils: '[...] .compact.join (',')' –

Problemi correlati