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 です。