1

.csv ファイルと複数の 2 つの列を一緒にするエレガントな方法を考えられる人はいますか?

身長と体重から人の体格指数 ( BMI Wikipaedia ) を計算し、3 番目の列に保存したいと考えています。

式は次のとおりです。

weight/height^2

.csv を 1 行ずつ読み取るか、配列の配列を作成する必要がありますか?

データは次のようになります。

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,

ありがとう

アップデート:

これまでのところ、身長と体重の2つの配列があります

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

...そして今、2つの配列があり、一方の配列のインデックス 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

2 つの配列を取得したら、次のようにします。

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 に答える