perl で foobar.csv.gz を書き出す
一人アドベントカレンダー 2014 8 日目 by @takkyuuplayer
perl で gz 圧縮された csv を出力したいことがある。 今回はその話。
CSVの出力
Text::CSV_XS を使いましょう。
use IO::File; use Text::CSV_XS; my $out = IO::File->new("./cache/test.csv", 'w'); my $rows = [ { name => 'col1', value => 'val1', }, { name => 'col2', value => 'val2', }, { name => 'col3', value => 'val3', }, ]; my $csv = Text::CSV_XS->new({binary => 1}); for my $row (@$rows) { my @columns = map { $row->{$_} } qw(name value); ok $csv->combine(@columns); $out->print($csv->string() . "\n"); } $out->close();
gz の出力
IO::Compress::Gzip を使いましょう。
use IO::Compress::Gzip qw(gzip $GzipError); my $z = new IO::Compress::Gzip("./cache/test.csv.gz") or die "gzip failed: $GzipError\n"; $z->print('name, value' . "\n"); $z->close();
合わせ技
use IO::Compress::Gzip qw(gzip $GzipError); use Text::CSV_XS; my $rows = [ { name => 'col1', value => 'val1', }, { name => 'col2', value => 'val2', }, { name => 'col3', value => 'val3', }, ]; my $csv = Text::CSV_XS->new({binary => 1}); my $z = new IO::Compress::Gzip("./cache/test.csv.gz") or die "gzip failed: $GzipError\n"; for my $row (@$rows) { my @columns = map { $row->{$_} } qw(name value); $csv->combine(@columns); $z->print($csv->string() . "\n"); } $z->close();
次回予告
明日の担当も @takkyuuplayer です。