2012-04-12 61 views
0

我試圖使用CSV三個數字輸出它的平均值來計算一個單獨的文件。特別是,打開一個文件,取第一個值(名稱),然後計算下三個值的平均值。對文件中的每個人多次執行此操作。添加元素一起

這裏是我的Book1.csv

Tom,90,80,70 
Adam,80,85,83 
Mike,100,93,89 
Dave,100,100,100 
Rob,80,70,75 
Nick,80,90,70 
Justin,100,90,90 
Jen,80,90,100 

我試圖得到它的輸出是:

Tom,80 
Adam,83 
Mike,94 
Dave,100 
Rob,75 
Nick,80 
Justin,93 
Jen,90 

我讓每個人在數組中,我能得到這個工作與我寫的基本的「僞」代碼,但它不起作用。 這裏是我到目前爲止的代碼:

#!/usr/bin/ruby 
require 'csv' 
names=[] 
grades1=[] 
grades2=[] 
grades3=[] 
average=[] 
i = 0 
CSV.foreach('Book1.csv') do |students| 
    names << students.values_at(0) 
    grades1 << reader.values_at(1) 
    grades2 << reader.values_at(2) 
    grades3 << reader.values_at(3) 
end 

while i<10 do 
    average[i]= grades1[i] + grades2[i] + grades3[i] 
    i= i + 1 
end 

CSV.open('Book2.csv', 'w') do |writer| 
    rows.each { |record| writer << record } 
end 

while循環的部分是我最關心的部分。任何見解?

+0

CSV文件的一個示例非常重要。 – Phrogz 2012-04-12 15:22:24

+1

這是一個很大的額外工作 - 似乎是它可以在一個單一的迴路來完成,並且沒有所有的中間陣列。 – 2012-04-12 15:23:12

回答

2

如果要總結值的數組,你可以使用:

sum = array.inject(:+) 

如果你改變你的數據結構:

grades = [ [], [], [] ] 
... 
grades[0] << reader.values_at(1) 

然後,你可以這樣做:

0.upto(9) do |i| 
    average[i] = (0..2).map{ |n| grades[n][i] }.inject(:+)/3 
end 

有各種各樣的方法來改善你的數據結構,上面的是你的合作是最有影響力的一個德。

任何時候你發現自己寫:

foo1 = ... 
foo2 = ... 

你應該認識到它作爲代碼味道,想想你如何可以組織更好地收集數據。


這裏是我怎麼會做這樣的重寫。請注意,它適用於任何分數,而不是硬編碼爲3:

require 'csv' 
averages = CSV.parse(DATA.read).map do |row| 
    name, *grades = *row 
    [ name, grades.map(&:to_i).inject(:+)/grades.length ] 
end 
puts averages.map(&:to_csv) 
#=> Tom,80 
#=> Adam,82 
#=> Mike,94 
#=> Dave,100 
#=> Rob,75 
#=> Nick,80 
#=> Justin,93 
#=> Jen,90 

__END__ 
Tom,90,80,70 
Adam,80,85,83 
Mike,100,93,89 
Dave,100,100,100 
Rob,80,70,75 
Nick,80,90,70 
Justin,100,90,90 
Jen,80,90,100 
+0

我已經編輯我的回答對使用您的數據,並創建最接近的整數平均(而不是使用浮點除法),因爲那是你說你想要的。 – Phrogz 2012-04-12 15:36:02

+0

我的問題在於如何實現這個訪問Book1.csv? – 2012-04-12 15:48:06

+0

查看[CSV的文檔](http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html)瞭解如何從文件創建數組(提示:參見'read ')。但總的來說,我的答案中最重要的是如何將一排成績與平均成績相提並論;有很多方法可以使用它將一個整個文件轉換爲另一個文件。 – Phrogz 2012-04-12 16:00:37