めも:perlでcsvデータ
2014/4/16 [09:02:27] (水) 

最近あまりスクリプトを書いてなくて、いざ書こうと思ったら忘れていてビックリしたのでメモ。
csv(コンマ区切り)に限らずタブ区切りでも同じく。
DBIを使ってデータベースと同じように扱うモジュールもあるけど、そこまでのスペックは不要で、とりあえず目の前にあるエクセルや管理ページからダウンロードしたcsvを扱えればそれだけでOKというところ。
コンマやタブで区切られて、ヘッダがついていてデータが並んでいる
date,title,count,amount
2014/4/1,アロイのやさしい神さま,2,210
てな感じのデータ。
これを split してそのまま配列に入れればいいだけなんだけど、
my @w = split(’,’);
単純に区切りでバラして配列に入れただけだと、データを取り出す時に $w[1] などと書くことになる。それよりはハッシュ(連想配列)にして $_->{title} などとヘッダでつけた名前(キー)で取り出せた方が間違いも少ない。
ヘッダをキーにしてデータを入れて取り出せるようにするのが以下(改行やEncodeなどは省略)
my @head;
my @buf;
while(<IN>){
my %h;
my @w = split(/,/);
@head=@w , next if( ! @head );
@h{ @head } = @w;
push(@buf, \%h);
}
たぶんここがハッシュ(連想配列)の面白い書き方。
ヘッダ(文字)の配列をキーに、データの配列を値に一度に入れてしまう部分。
h{date} = ’2014/4/1’; h{title} = ’アロイのやさしい神さま’; h{count}=2; h{amount}=210;
↑と同じことを一行で↓
@{ h{ @head } }= @w;
これのおかげで、カラム数が100とか200とか多くてもへっちゃら。
@bufという配列に一行ずつハッシュとして入って、データの取り出しもキー(名前)でわかりやすく。
てのを、仕事でもプライベートでも何度もあちこちで使い捨てで書き散らしていたんだけど、メモがどこにも残ってなかったので改めて。
どうでもいいけど、「ハッシュ」って色気がないよなあ。せっかく「連想配列」というそそられる名前があるんだからこちらを使うべき。

