matsuok’s diary

あくまでも個人的意見であり感想です

CSV ファイルをRubyで処理

  • 歩数計データを、ウェルネスリンク機器専用 測定記録取り込みソフトウェアからCSVにエクスポート
  • エデイタで読み込み漢字コードをutf8で保存
  • 歩行距離などを集計し、平均値を読み込む
  • ヘッダーは、行のカラム配列のハッシュキーとなり、ヘッダー値でカラム値を参照できる

f:id:matsuok:20200602092825j:plain

歩行データヘッダー付きuft8 CSVデータ

require 'csv'
puts "$0:#{$0}"
ARGV.each_with_index do |arg, i|
 puts "ARGV[#{i}]:#{arg}"
 csvfile = ARGV[i]
 csv_data = CSV.read(csvfile, headers: true)
 sum = 0.0
 cnt = 0
 max = 0.0
 min = 999.999
 fromdate = nil
 todate = nil
 csv_data.each do |data|
  if fromdate == nil
    fromdate = data["日付"]
  end
  todate = data["日付"]
  intro_msg = "#{data["日付"]}#{data["歩数(歩)"]}歩数(歩)、#{data["歩行距離(km)"]}歩行距離(km)です。\n"
  if data["歩数(歩)"] == nil
    puts 'no data ' + intro_msg
  else
    sum = sum + data["歩行距離(km)"].to_f
    cnt = cnt + 1
    if max < data["歩行距離(km)"].to_f
      max = data["歩行距離(km)"].to_f
    end
    if min > data["歩行距離(km)"].to_f && data["歩行距離(km)"].to_f > 0.0
      min = data["歩行距離(km)"].to_f
    end
  end
 end
 puts 'start:' + fromdate + ' to:' + todate + "\n"
 total_msg = "合計件数:#{cnt} 平均歩行距離(km):#{(sum/cnt).round(3)}    MAX歩行距離(km):#{max} MIN歩行距離(km):#{min}\n"
 puts total_msg
end

実行結果

E:\ruby>ruby csv.rb HJ-205IT_1_1_170901-200331utf8.csv
$0:csv.rb
ARGV[0]:HJ-205IT_1_1_170901-200331utf8.csv
no data 2017/12/02の歩数(歩)、歩行距離(km)です。
no data 2017/12/03の歩数(歩)、歩行距離(km)です。
no data 2017/12/04の歩数(歩)、歩行距離(km)です。
no data 2018/10/20の歩数(歩)、歩行距離(km)です。
no data 2018/10/21の歩数(歩)、歩行距離(km)です。
no data 2018/10/23の歩数(歩)、歩行距離(km)です。
no data 2018/10/24の歩数(歩)、歩行距離(km)です。
no data 2018/10/25の歩数(歩)、歩行距離(km)です。
no data 2018/10/26の歩数(歩)、歩行距離(km)です。
no data 2018/12/31の歩数(歩)、歩行距離(km)です。
no data 2019/01/01の歩数(歩)、歩行距離(km)です。
no data 2019/03/02の歩数(歩)、歩行距離(km)です。
start:2017/09/01 to:2020/03/31
合計件数:931 平均歩行距離(km):4.056 MAX歩行距離(km):9.9 MIN歩行距離(km):0.2