2015-01-07 88 views
9

我有一個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 

在一個文件I希望減去行的值[1]從行的值[0]來創建一個新的「weekly_total」值。然後,我將這個值的數組輸出到名爲weeklyStats.csv的文件中。這會輸出一列值很好的值。

不過,我想從另一個文件(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不會捕獲異常,因此不能轉換爲字符串。問題是,我已經嘗試將weekly_total轉換爲字符串和數組,因爲我認爲它可能是問題(類型不匹配),但我不知道從哪裏去。誰能幫忙?在串

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

+0

刪除尾隨欄|在第42行'。 – mudasobwa

+0

感謝您回覆我。不幸的是,這沒有奏效,我想我需要那個|以包含與集合 –

+0

關聯的變量(在本例中爲數組),對不起,我沒有意識到這些是前一個字符串的一部分。然後只需從上一行刪除回車。 – mudasobwa

回答

12

其中一個(或多個)值成爲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 

BTW,整個條款可以在更rubyish的方式改寫:從`col_weeklyTotal

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

我認爲你是正確的零值,但不幸的是.to_s停止了錯誤發生,但列仍然沒有寫入文件。我有一種感覺,可以通過+ nil.to_s顯式轉換來解決問題,但我在.puts中嘗試了這一點,但它仍然無法工作。我也改變了他每週的總數。每個做到CSV.foreach('compareData.csv',轉換器:數字)do | row | \t weekly_total << row [0] - row [1] \t end \t weekly_total.each do | i | \t weeklyStatsFile.puts我 結束無效:( –

+2

嘿謝謝,我已經解決了這個問題.to_s工作到最後,這只是我把變量weekly_total首先放入一個單獨的文件,並試圖閱讀這是因爲我並不知道最初轉換爲字符串,我認爲這會修復它。無論如何,一旦我放棄了其他文件,您的答案就可以工作。乾杯! –

+0

您也可以使用'.compact'數組刪除任何nils:'[...] .compact.join(',')' –

相關問題