tokuhirom's Blog

Amon2 により CSV を PSGI/Plack で出力する方法

Amon2::Plugin::Web::Streaming と Text::CSV_XS の組み合わせにより、ストリーミング出力が可能です。 (Streaming 出力をサポートしたサーバーをつかって実装する必要があります)

use strict;
use warnings;
use utf8;
use Amon2::Lite;
use Text::CSV_XS;

sub load_config { +{ } }

get '/csv' => sub {
    my $c = shift;
    $c->streaming(sub {
        my $respond = shift;
        my $csv = Text::CSV_XS->new({binary => 1});
        my $writer = $respond->([200, ['Content-Type' => 'text/csv']]);
        $csv->combine(1,2,3);
        $writer->write($csv->string . "\n");
        $csv->combine(4,5,6);
        $writer->write($csv->string . "\n");
        $writer->close();
    });
};

__PACKAGE__->load_plugin('Web::Streaming');
__PACKAGE__->to_app(handle_static => 1);

より実用的な例でいいますと、DB からの出力は以下のように実装できます。

while (my @row = $sth->fetchrow_array()) {
  $csv->combine(@row);
  $writer->write($csv->string . "\n");
}
$writer->close();