Macro/投稿/70

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F70


Top > Macro > 投稿 > 70

タブ区切りのテーブル整形

  • ページ: Macro/投稿
  • 作者: りーや?
  • カテゴリー: pls
  • 投稿日: 2005-09-25 (日) 09:45:20

メッセージ

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
# タブ区切りのテーブル整形
# 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 


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2006-07-30 (日) 00:43:59 (6474d)