web-dev-qa-db-fra.com

pas de conversion implicite de nil en erreur de chaîne

J'ai un script Ruby qui va créer deux fichiers en prenant et en fusionnant les valeurs d'un autre fichier.

#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

Dans un fichier, je souhaite soustraire les valeurs de la ligne [1] des valeurs de la ligne [0] pour créer une nouvelle valeur 'hebdomadaire_total'. Je produis ensuite ce tableau de valeurs dans un fichier appelé hebdomadaireStats.csv. Cela affichera une colonne de valeurs très bien.

Cependant, je veux joindre ces valeurs avec un autre ensemble d'un autre fichier (autoCapture.csv) et lorsque j'essaie de les compresser en tant que tableaux afin qu'ils lisent les lignes correspondantes, j'obtiens l'erreur:

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

Je suppose que cela signifie que le tableau Zip n'attrapera pas d'exception si l'une des valeurs est nulle et ne peut donc pas être convertie en chaîne. Le problème est que j'ai essayé de convertir hebdomadaire_total en chaîne et tableau car je pensais que c'était peut-être le problème (une incompatibilité de types) mais je ne sais pas où aller à partir d'ici. Quelqu'un peut-il aider?

14
Angela Jonon

Une (ou plusieurs) valeurs dans la chaîne

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

est devenu nil. Pour corriger la sortie, vous devez explicitement les convertir en chaînes:

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, la clause entière pourrait être réécrite de manière plus rubis:

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