作っている最中のアプリがあるんだけど、どうもにつまったので、学んだ内容を包み隠さずアウトプットとして残すことにします。
今現在、行き詰まっているのはRUBY上でcsvを扱うことについて。
ヘッダーが日本語のcsvを取り込んでグラフ化したいっていうのがゴールなんだけど、これだけの事が中々理解出来ずにいます。
下記サイトを参考に色々といじってみたのですが、基本的なブロック変数(引数?)が理解できてない状態。
###使っているcsv
測定器,シリアル番号,タイムスタンプ測定器,記録タイプ,過去のグルコース値 mg/dL,血糖値をスキャンする mg/dL,超速効型インスリン(数値入力なし),超速効型インスリン値(単位),食事(数値入力なし),炭水化物(グラム),炭水化物(回分),持効型インスリン(数値入力なし),持効型インスリン値(単位),メモ,ストリップグルコース mg/dL,ケトン mmol/L,食事時インスリン(単位),補正インスリン(単位),使用者による変更インスリン(単位)
FreeStyle リブレ,JCGY177-T2765,2020-05-16 2:37,0,194,,,,,,,,,,,,,,
FreeStyle リブレ,JCGY177-T2765,2020-05-16 2:52,0,204,,,,,,,,,,,,,,
FreeStyle リブレ,JCGY177-T2765,2020-05-16 3:07,0,209,,,,,,,,,,,,,,
FreeStyle リブレ,JCGY177-T2765,2020-05-16 3:22,0,211,,,,,,,,,,,,,,
この中で扱いたいのが、日時とグルコース値だけなので、
参考サイトを見つつこんな感じで取り出してみた。
###参考サイトの実験
require 'csv'
HEADER_TO_SYM_MAP = {
'タイムスタンプ測定器' => :id,
'過去のグルコース値 mg/dL' => :guru,
}
header_converter = lambda { |h| HEADER_TO_SYM_MAP[h] }
csv = CSV.read('test/RUBY/csv.csv', headers: :first_row, header_converters: header_converter, converters: :integer, skip_blanks: true)
csv.each do |row|
HEADER_TO_SYM_MAP.values.each { |k| puts "#{k} : #{row[k]}" }
end
###結果
RUBY % ruby test.rb
id : 2020-05-16 2:37
guru : 194
id : 2020-05-16 2:52
guru : 204
id : 2020-05-16 3:07
guru : 209
id : 2020-05-16 3:22
guru : 211
この中で、グラフ化にする際に、どの変数を扱えばいいかわからないのと、
header_converter = lambda { |h| HEADER_TO_SYM_MAP[h] }
のうち|h|をなんで使っているかがわからないのです・・・。
そんな訳で、基本のキかもしれないけど|h|とか|k|の扱いを理解するためにブロック変数とか引数とか調べて、わかり次第追記します。