使用ruby来操作.csv文件:将两列相乘

时间:2012-11-24 01:43:15

标签: ruby csv

任何人都可以想到将.csv文件和多个两列放在一起的优雅方法吗?

我想根据身高和体重计算人体质量指数(BMI Wikipaedia)并将其存储在第三列。

公式为:

weight/height^2

我应该逐行读取.csv还是制作一个数组数组?

数据看起来像这样。

ID,Forename,Surname,height,weight,
0,jack,smith,177,80,
1,dan,barker,178,82,
2,ben,allen,176,93,
3,ian,bell,175,76,
4,tim,hope,174,75,
5,john,smith,165,80,

由于

更新:

到目前为止,我有两个身高和体重数组

require 'csv'
filename = 'bmi_test.csv'

height = []
weight = []

CSV.foreach(filename, :headers => true) do |row|
  height << row[3].to_i
  weight << row[4].to_i
end

...现在我有两个数组,我试图将索引0与另一个数组中的索引0相乘。

3 个答案:

答案 0 :(得分:4)

require 'csv'

CSV.open("output.csv", "wb", :headers => true) do |output|
  CSV.foreach("input.csv", :headers => true, :return_headers => true) do |row|
    if row.header_row?
      output << (row << "bmi")
    else
      output << (row << row['weight'].to_f / (row['height'].to_f / 100) ** 2)
    end
  end
end

或者,如果您不想输出CSV,只需将结果放在数组中:

result = []
CSV.foreach("input.csv", :headers => true) do |row|
  result << (row << row['weight'].to_f / (row['height'].to_f / 100) ** 2)
end

您现在应该有一个数组,您可以在其中访问result[0]['bmi']等。

答案 1 :(得分:0)

一旦你拥有了两个阵列,这是一种方法:

bmi = weight.each_with_index.map { |w, i| w.to_f / height[i]**2 }

答案 2 :(得分:-1)

可以使用ruby完成此操作,但是对于优雅的解决方案,请使用awk

awk -F, 'NR==1 { print $0 "bmi"; next } { printf "%s%.2f\n", $0, $5/($4/100)^2 }' file

结果:

ID,Forename,Surname,height,weight,bmi
0,jack,smith,177,80,25.54
1,dan,barker,178,82,25.88
2,ben,allen,176,93,30.02
3,ian,bell,175,76,24.82
4,tim,hope,174,75,24.77
5,john,smith,165,80,29.38