2015-01-07 13 views
9

Başka bir dosyadan değerler alıp birleştirerek iki dosya oluşturacak bir ruby ​​komut dosyasına sahibim. Bir dosyadanil için örtülü bir örtük bir dönüşüme dönüştürülmedi Hata

#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 aralıksız değerleri çıkarmak isteyen [1] aralıksız değerlerden [0], yeni bir 'weekly_total' değer yaratmak. Daha sonra bu değer dizisini weeklyStats.csv adlı bir dosyada gönderirim. Bu, bir değer sütununu gönderir.

Ancak, ben başka bir dosya (autoCapture.csv) dan başka bir set ile bu değerleri katılmak istiyorum ve diziler olarak zip çalıştığımda hata alıyorum onlar satırları gelen okurlar, böylece:

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

Bunun anlamı, değerlerden birinin sıfır olması ve bu nedenle dizeye dönüştürülememesi durumunda, dizi zipinin bir istisna yakalayamayacağı anlamına gelir. Sorun şu ki, problemin (türlerin uyumsuzluğu) olabileceğini düşündüğüm için string ve diziye weekly_total dönüştürmeyi denedim, ama buradan nereye gideceğimi bilmiyorum. Biri yardım edebilir mi?

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

dize

yılında

+0

Kaldır sondaki çubuğu 'col_weeklyTotal den |' hattı 42. – mudasobwa

+0

Bana döndüğün için teşekkürler. Ne yazık ki işe yaramadı, bence buna ihtiyacım var | –

+0

Ah koleksiyonuyla ilişkili değişkenleri (bu durumda diziler) kapatmak için üzgünüm, bunların önceki dizenin bir parçası olduğunun farkında değildim. Ardından, önceki satırdan satırbaşı iadesini kaldırmanız yeterlidir. – mudasobwa

cevap

12

biri (veya daha fazla) değerleri nil oldu. çıktısını düzeltmek için açıkça dizeleri bunları kullanması gereklidir:

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, tüm fıkra daha rubyish şekilde yeniden yazılabilir olabilir:

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

Bence nil değer hakkında haklısınız ama maalesef .to_s hata oluşmasını durdurdu ama sütun hala dosyaya yazmadı. Sorunun + nil.to_s açık dönüşümü ile düzeltilebileceğine dair bir fikrim var ama bunu .put'larda denedim ve hala işe yaramadı. Ayrıca haftalık toplamı değiştirdim. CSV.foreach'a ('compareData.csv', dönüştürücüler:: sayısal) do | row | \t weekly_total << satır [0] - satır [1] \t end \t weekly_total.each do | i | \t weeklyStatsFile.puts i boşuna sonlandır :( –

+2

Hey teşekkürler, şimdi bunu çözdüm .to_s sonunda çalıştı, sadece ilk olarak ayrı bir dosyaya değişkenini koyup okumaya çalışıyorum. Geri dönüş değeri, çünkü başlangıçta dize dönüştürme hakkında bilmedim ve bunu düzelteceğini düşündüm.Neyse, bir kez diğer dosyayı açtım, cevabınız işe yaradı.Şakalar! –

+0

Ayrıca kullanabilirsiniz. herhangi bir nils kaldırmak için dizisi: '[...] .compact.join (',')' –

İlgili konular