Text::CSV::Simpleはフィールドを指定してやるとCSV読み込むときにハッシュにしてくれるので DBD::CSVとかDBD::AnyDataよりも便利じゃないかと、こっちばっか使うようになってしまったのだが、Text::CSV::SimpleはCSVにありがちなヘッダー付きのcsvをうまく処理してくれない
仕方ないので、
$parser->field_map(qw/id name null town/); my @data = $parser->read_file($datafile); shift @data;
と、フィールド指定をして、ハッシュで受け取ってから、ヘッダーの行(最初の行)をshiftして落とすという処理をさせてた。でも、これだとフィールドが100とか200とかあるとfield_map書くのが面倒でたまらんので、ヘッダー処理するようにしてみた。
こんな感じのヘッダー付きのcsvを用意したら、
name,address,etc kz,tokyo,1 yu,kyoto,2 ha,mie,3
いつものように、Text::CSV::Simpleのノリで
use strict; use Text::CSV::Simple::WithHeader; use Data::Dumper; my $datafile = "data/test.csv"; my $parser = Text::CSV::Simple::WithHeader->new; my @data = $parser->read_file($datafile); print Dumper(\@data);
ちゃんとハッシュになって返ってくる。
$VAR1 = [ { 'name' => 'kz', 'address' => 'tokyo', 'etc' => '1' }, { 'name' => 'yu', 'address' => 'kyoto', 'etc' => '2' }, { 'name' => 'ha', 'address' => 'mie', 'etc' => '3' } ];
Text::CSV::Simple::WithHeaderに置いておいたがwant_fieldsには対応させてない。