2015-01-07 8 views
9

Mam skrypt ruby, który utworzy dwa pliki, pobierając i scalając wartości z innego pliku.brak niejawnej konwersji wartości zerowej na błąd łańcucha

#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 

jeden plik życzę odejmowanie wartości w wierszu [1] na podstawie wartości w wierszu [0] w celu stworzenia nowej weekly_total 'wartość. Następnie wysyłam tę tablicę wartości w pliku o nazwie weeklyStats.csv. To wyświetli kolumnę wartości fine.

Jednakże chcę dołączyć do tych wartości z innego zestawu z innego pliku (autoCapture.csv) i gdy próbuję je jako zip tablic tak, że czytać w poprzek w odpowiednich wierszy pojawia się błąd:

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

Zbieram to oznacza, że ​​zip tablicy nie wychwyci wyjątku, jeśli jedna z wartości jest zerowa i dlatego nie może przekształcić się w ciąg znaków. Problem polega na tym, próbowałem przekonwertować weekly_total na ciąg i tablicę, ponieważ myślałem, że to może być problem (niedopasowanie typów), ale po prostu nie wiem, dokąd się udać. Czy ktoś może pomóc?

+0

Usuwanie początkowych pasek z 'col_weeklyTotal |' w linii 42. – mudasobwa

+0

Dziękuję za skontaktowanie się z nami. Niestety to nie zadziałało, myślę, że potrzebuję tego aby zawrzeć zmienne (w tym przypadku tablice) związane z kolekcją –

+0

Ah, przepraszam, nie zdawałem sobie sprawy, że są one częścią poprzedniego ciągu. Następnie po prostu usuń powrót karetki z poprzedniego wiersza. – mudasobwa

Odpowiedz

12

Jeden (lub więcej) wartości w ciąg

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

stał nil. Aby rozwiązać wyjście należy jawnie wrzucili do strun:

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, cała klauzula może zostać przepisany w bardziej rubyish sposób:

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

Myślę, że masz rację co do wartości zerowej, ale niestety .to_s zatrzymał występujący błąd, ale kolumna nadal nie zapisała do pliku. Mam wrażenie, że problem można naprawić za pomocą jawnej konwersji + nil.to_s, ale próbowałem tego w .puts i nadal nie działał. Zmieniłem też jego cotygodniową sumę .aach do CSV.foreach ("compareData.csv", konwertery:: liczbowe) do | row | \t tygodniowy_total << wiersz [0] - wiersz [1] \t koniec \t tygodniowy_total.each do | i | \t weeklyStatsFile.puts i koniec na próżno :( –

+2

Hej dziękuję, naprawiłem to teraz.To działało w końcu, po prostu wstawiłem zmienną weekly_total do osobnego pliku najpierw i próbowałem odczytać Zrobiłem to, ponieważ nie wiedziałem o konwersji na ciąg początkowo i myślałem, że to naprawi ... W każdym razie, gdy porzuciłem drugi plik, twoja odpowiedź zadziałała. "Wiwaty! –

+0

Możesz również użyć' .compact' na array, aby usunąć wszystkie nils: '[...] .compact.join (',')' –

Powiązane problemy