нет неявного преобразования nil в String error
у меня есть скрипт ruby, который создаст два файла, взяв и объединив значения из другого файла.
#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
в одном файле я хочу вычесть значения в строке[1] из значений в строке[0], чтобы создать новое значение 'weekly_total'. Затем я выведу этот массив значений в файл под названием weeklyStats.csv. Это выведет столбец значений fine.
однако я хочу объединить эти значения с другим набором из другого файла (autoCapture.csv) , и когда я пытаюсь застегнуть их как массивы, чтобы они читали в соответствующих строках, я получаю ошибку:
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>'
Я понимаю, что это означает, что массив zip не поймает исключение, если одно из значений равно nil и поэтому не может преобразовать в string. Проблема в том, что я попытался преобразовать weekly_total в string и array, поскольку я думал, что это может быть проблема (несоответствие типов), но я просто не знаю, куда идти отсюда. Кто-нибудь может помочь?
1 ответов
одно из (или более) значений в строке
finalStatsFile.puts col_date+", "+col_constant1+", "+ col_appYear+", "+col_statsDesc+", "+col_constant2+", "+col_keyStats+", "+col_weeklyTotal
стало nil
. Чтобы исправить вывод, вы должны явно привести их к строкам:
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
кстати, вся статья может быть переписана в более rubyish образом:
finalStatsFile.puts [ col_date,
col_constant1,
col_appYear,
col_statsDesc,
col_constant2,
col_keyStats,
col_weeklyTotal ].map(&:to_s).join(', ')