データベースに格納したデータを取得して、それをブラウザで表示する、というのを書いていて、同時に、CSV形式にして、ボタンをクリックするとそのCSVをダウンロードさせる的な挙動をさせたい時に書いたコード。
データベースから取得したデータは、例えば下記のような構造になっているとする。
$out = {
filename => '12345.csv',
csv => [ [ a, b, c, d, e], [ 1, 2, 3, 4, 5] ... ]
}
CGI.pmを使ってこれを出力する場合。(Text::CSVを使っています)
print qq/Content-Disposition: attachment; filename="$out->{filename}"\n/;
print header( -type => 'application/octet-stream');
my $csv = Text::CSV->new();
for my $row ( @{ $out->{csv} } ){
$csv->print(*STDOUT, $row);
print "\n";
}
Text::CSVの print は下記のようなことをしています。
combine + string + print
$csv->combine( @array );
print $csv->string();
これだと、CSVの改行がないので、改行も追加しています。
ただ、これだと、日本語は文字化けすると思うので、Encodeは必要かと。
use Encode 'encode_utf8';
$csv->combine( @array );
print encode_utf8( $csv->string() );
など。binmodeを使って、出力の文字コードを一括で制御するということでもOK。
参考: