めも: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という配列に一行ずつハッシュとして入って、データの取り出しもキー(名前)でわかりやすく。


てのを、仕事でもプライベートでも何度もあちこちで使い捨てで書き散らしていたんだけど、メモがどこにも残ってなかったので改めて。


どうでもいいけど、「ハッシュ」って色気がないよなあ。せっかく「連想配列」というそそられる名前があるんだからこちらを使うべき。


<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】