巨大なテキストファイルをブラウザで覗き見するための簡単な CGI
2011-03-08-2
[Programming]
何かのタスクの出力結果として巨大なテキストファイルが得られたとします。これが手元の UNIX 環境に置いてあるだけなら less コマンドや head, tail コマンドでさらっと中身を覗けます。
しかし、他の何人かで共有して中身を軽く確認してもらいたいという場面があります。IT系でない人に見てもらいときなどはいろいろと大変です:
(1) データの置いてあるサーバにログインしてもらう→「アカウントない」「コマンドわからない」
(2) イントラのファイル共有→「ファイルが大きすぎて開けない」
(3) イントラWebサイトにアップロードしてブラウザで見てもらう→「IEが固まる」「PCが激重」
こういうときには100行くらいのページごとに表示するCGIが役に立ちます。昔からよく使っている「その場しのぎ」CGIを載せておきます。
■コード(textviewer.cgi):
設置例:
http://chalow.net/misc/textviewer.cgi
(対象データは cl.itemlist。ブログ内検索用のテキストファイルで2MB, 12000行。EUC-JP なのでコードもちょっと変更してます。)
しかし、他の何人かで共有して中身を軽く確認してもらいたいという場面があります。IT系でない人に見てもらいときなどはいろいろと大変です:
(1) データの置いてあるサーバにログインしてもらう→「アカウントない」「コマンドわからない」
(2) イントラのファイル共有→「ファイルが大きすぎて開けない」
(3) イントラWebサイトにアップロードしてブラウザで見てもらう→「IEが固まる」「PCが激重」
こういうときには100行くらいのページごとに表示するCGIが役に立ちます。昔からよく使っている「その場しのぎ」CGIを載せておきます。
■コード(textviewer.cgi):
#!/usr/bin/perl -T
use strict;
use warnings;
use CGI;
use HTML::Template;
my $filename = "(TEXTFILENAME)";
my $n = 100;
my $q = new CGI;
my $from = $q->param('f') || 1;
my $next_line = $from + $n;
my $pre_line = ($from - $n > 1) ? $from - $n : 1;
open(my $fh, "<", $filename) or die;
my $str = "";
while (<$fh>) {
next if $. < $from;
last if $. >= $from + $n;
$str .= $_;
}
close($fh);
my $template = join("", <DATA>);
my $t = HTML::Template->new(scalarref => \$template,
global_vars => 1,
die_on_bad_params => 0);
$t->param(from => $from);
$t->param(str => $str);
$t->param(next_line => $next_line);
$t->param(pre_line => $pre_line);
print $q->header(-charset => 'UTF-8'), $t->output();
__DATA__
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Large Text File Viewer</title>
</head>
<body>
<a href="?f=<TMPL_VAR name=pre_line>"><<</a>
<a href="?f=<TMPL_VAR name=next_line>">>></a>
<hr>
<pre><TMPL_VAR name=str></pre>
<hr>
<a href="?f=<TMPL_VAR name=pre_line>"><<</a>
<a href="?f=<TMPL_VAR name=next_line>">>></a>
</body>
</html>
設置例:
http://chalow.net/misc/textviewer.cgi
(対象データは cl.itemlist。ブログ内検索用のテキストファイルで2MB, 12000行。EUC-JP なのでコードもちょっと変更してます。)
この記事に言及しているこのブログ内の記事
