1

谁能想到一种优雅的方式来将 .csv 文件和多个两列放在一起?

我想根据身高和体重计算一个人的体重指数( BMI Wikipedia )并将其存储在第三列中。

公式为:

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 相乘。

4

3 回答 3

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'],等等。

于 2012-11-24T02:17:42.553 回答
0

拥有两个数组后,这是一种方法:

bmi = weight.each_with_index.map { |w, i| w.to_f / height[i]**2 }
于 2012-11-24T02:11:42.180 回答
-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
于 2012-11-24T01:56:43.490 回答