◀マクロトップへ
  • 220 テーブル整形 PerlScript
  • [220] テーブル整形 PerlScript りーや 2005年09月25日 09:45

    # タブ区切りのテーブル整形
    # 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