2012-04-12 57 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