任何人都可以想到将.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相乘。
答案 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