2005年09月16日

Text::ASCIITable 人間フレンドリーな表組み出力

お気に入りのPerl CPAN モジュール Text::ASCIITable のご紹介

これはどんなことをしてくれるかというと、

my $senkyo = [
    [ jimin  => 296 ],
    [ komei  =>  31 ],
    [ minsyu => 113 ],
];

みたいなデータがあったとして、

use Text::ASCIITable;
my $t = new Text::ASCIITable();

$t->setCols('TOU', 'GISEKI');

foreach (@$senkyo) {
    $t->addRow(@$_);
}

print $t->draw();

すると、

.=-------+---------=.
| TOU    | GISEKI   |
|=-------+---------=|
| jimin  |      296 |
| komei  |       31 |
| minsyu |      113 |
'=-------+---------='

こうしてくれます。

基本は setCols() で HTML の <table> でいうところの <th> をまず作成し、addRow() に配列を渡して行を増やし、draw() して表を作成、です。Tieされているので、addRow() の代わりに pushdraw() の代わりに print が使えたりします。

例えばバッチで動かすような何かの集計結果をメールで受け取るときとか便利。

こういうの、簡単そうだからって自分でやろうとすると、けっこう苦労する。ちょっとは苦労して、sprintfのオプションをいろいろ覚えるのはよいことかもしれないけど。

あと、Text::ASCIITableは数字っぽいものは自動で右寄せにしてくれるのがちょっとイカしてます。

微妙に似たようなモジュールがいくつかあって、けっきょくこれに落ち着いてひそかに気にいっていたんだけど、これが Catalyst テストサーバーのログにも使われていたのがうれしかったです。

もちろん表組で使う罫線とか左寄せとか右寄せとかいろいろ変更できます。ぼくは MySQL シェルっぽくするのが好きです。

オプションについて詳しくはPODご覧あれなのですが、例えば、

use Text::ASCIITable;
sub asciitable {
    my ($title, $data) = each %{ shift() or return };
    my $t = new Text::ASCIITable({ headingAlign => 'left', drawRowLine => 0 });

    $t->setOptions(headingText => $title);
    $t->setCols(shift @$data);
    $t->addRow(@$_) for @$data;

    $t->draw(['+-','-+','-','-'],
             ['|','|','|'],
             ['+-','-+','-','+'],
             ['|','|','|'],
             ['+-','-+','-','+']), "\n";
}

こんなサブルーチンを作っておいて、次のような形式の、タイトルがキーで、一個目の項目が表のヘッダになるリストのリストのハッシュリファレンス(つまり下のようなデータ)を渡す、とキメておけば、

my $data;
$data->{'Weather Forecast: Tokyo'} = [
    [ 'Date', '', 'High', 'Low', 'Rain' ],
    [ '9/16', 'Sunny', 28, 20, '10%' ],
    [ '9/17', 'Partly Cloudy', 30, 22, '20%' ],
    [ '9/18', 'Partly Cloudy', 31, 23, '10%' ],
];

>print asciitable($data); とすると

+------------------------------------------+
| Weather Forecast: Tokyo                  |
+------+---------------+------+-----+------+
| Date |               | High | Low | Rain |
+------+---------------+------+-----+------+
| 9/16 | Sunny         |   28 |  20 |  10% |
| 9/17 | Partly Cloudy |   30 |  22 |  20% |
| 9/18 | Partly Cloudy |   31 |  23 |  10% |
+------+---------------+------+-----+------+

と出力されてよい感じです。

データとなる行の列数は、ヘッダで指定した列数より項目が少ない場合は平気ですが、多い場合は Received too many columns と warning が出てその行は飛ばされます。基本日本語もいけます。お試しあれ。

いじょう。

あ、インストールは perl -MCPAN -e 'install Text::ASCIITable' するか、コンパイル必要ないので、ダウンロード してきて、

適当なフォルダ
 |
 +- Text
     |
     +- ASCIITable.pm
     |
     +- ASCIITable
         |
         +- Wrap.pm

となるようにし、コード内で use lib '適当なフォルダのパス'; すればOK。


追記:0.17にバージョンがあがりました。
http://search.cpan.org/src/LUNATIC/Text-ASCIITable-0.17/Changes

不具合解消+機能追加で、CatalystのMLでもアップグレードがすすめられています。
http://lists.rawmode.org/pipermail/catalyst/2005-September/001741.html

機能としては、均等割付が追加されました。日本語がどうなるかはまだ試していませんがおもしろいですね。

あとデフォルトの罫線の角のところがちょっとシンプルになりよい感じです。

   .-----+-----+-------+------.
   | one | two | three | four |
   |=----+-----+-------+-----=|
   | one | one | one   | one  |
   | two | two | two   | two  |
   '-----+-----+-------+------'

追記:Catalystではこれが没になって、Text::SimpleTable が使われるようになったらしいです。こっちは機能が削られたかわり、使い方が楽でよいかも。


TrackBack

Comments

コメントをどうぞ


冨田尚樹
Naoki Tomita
loading from twitter
たぶん人気なもの
del.icio.us/scrap
今日のCPANモジュール
とみた広報
Syndicate this site
Syndicate this site
あわせて読みたい なかのひと