# タブ区切りのテーブル整形
# table.pls
$[ = 1; # set array base to 1
$FS = "\t"; # set field separator
$blanks = sprintf('%100s', ' ');
$number = "^[+-]?([0-9,]+[.]?[0-9]*|[.][0-9]+)\$";
$str = $Editor->GetSelectedString(0); # 選択部分の文字列を取得
if(! $str){exit;} # 選択範囲がなければ終了
# 各行を一行ずつ処理、一巡目で各項目の最大桁取得
foreach(split(/\r\n/,$str)){
chomp; # strip record separator
$NR++;
@Fld = split($FS, $_, 9999);
$row{$NR} = $_; # 項目数
for ($i = 1; $i <= $#Fld; $i++) { # 各フィールドの処理
if ($Fld[$i] =~ $number) { # 数字
if($Fld[$i] =~ /\./) {
($int[$i], $fra[$i]) = split(/\./, $Fld[$i]);
$iwid{$i} = &max($iwid{$i}, length($int[$i])); # 整数
$fwid{$i} = &max($fwid{$i}, length($fra[$i])); # 小数
$nwid{$i} = &max($nwid{$i}, $iwid{$i}+$fwid{$i}+1);
} else {
$iwid{$i} = &max($iwid{$i}, length($Fld[$i]));
$nwid{$i} = &max($nwid{$i}, $iwid{$i});
}
$wid{$i} = &max($wid{$i}, $nwid{$i});
}
$wid{$i} = &max($wid{$i}, length($Fld[$i]));
}
}
# 各行を作業エリアから再処理、二巡目で編集出力
for ($r = 1; $r <= $NR; $r++) {
$n = (@d = split($FS, $row{$r}, 9999));
for ($i = 1; $i <= $n; $i++) {
$sep = ($i < $n) ? ' ' : "\r\n"; #???
if ($d[$i] =~ $number) {
$rtn .= sprintf('%' . $wid{$i} . 's%s', &numjust($i, $d[$i]), $sep);
}
else {
$rtn .= sprintf('%-' . $wid{$i} . 's%s', $d[$i], $sep);
}
}
}
$Editor->InsText($rtn);
sub max {
my($X, $Y) = @_;
(($X > $Y) ? $X : $Y); #??? gt > chenge
}
sub numjust {
my($n, $S) = @_;
if($fwid{$n}){ # 小数以下部分あり
my($i, $f) = split(/\./, $S);
if($f){ # 小数以下の長さを最大合わせでスペースを補う
$S .= substr($blanks, 1, $fwid{$n} - length($f));
} else { # 小数点の分1桁も足す
$S .= substr($blanks, 1, $fwid{$n} + 1);
}
}
# position s in field n
$S . substr($blanks, 1, int(($wid{$n} - $nwid{$n}) / 2));
}
__END__
プログラミング言語awkのサンプルからa2p変換して
さらに数値項目の小数点位置あわせを追加しました
「キー割り当て一覧のコピー」や表計算ソフトから
の出力などのタブ区切りの値をエディタ上で見易い
テーブル整形を行うPerlScriptです。
整形する範囲を選択してからこのマクロを実行。
end of script