Excel 列名変換問題やってみた2011年11月12日 16時50分01秒

問題1: Excel列名変換問題
  • 仕様
    • 入力されたアルファベットを数字に変換する。
    • 変換ルールはExcelの列名と同等。
    • 例) A=1、B=2、Z=26、AA=27、XFD=16384
  • 起動時引数
    • [0] アルファベット (A~ZZZZ...[上限なし])
  • 実行例
    • ExcelColConv.pl A → 1
    • ExcelColConv.pl AA → 27

問題2: Excel列名変換問題(逆変換)
  • 仕様
    • 入力された数字をアルファベットに変換する。
    • ただし、問題1で作ったプログラムを拡張すること。
  • 起動時引数
    • [0] 0=数字へ変換、1=アルファベットへ変換
    • [1] 変換する数字またはアルファベット(どちらも上限なし)
  • 実行例
    • ExcelColConv.pl 0 AA → 27
    • ExcelColConv.pl 1 27 → AA

90分はかからなかったけどなぁ… まぁ、時間なんてちゃんと測ってないけど。

use strict;
use warnings;

sub exCol2Num ($) {
    my $col = shift;
    $col =~ /^[a-z]+$/io or die "Invalid Excel colmun name '$col'";
    my $num = 0;
    for my $letter ($col =~ /[a-z]/igo) {
        $letter = uc $letter;
        $num = $num * 26 + (unpack('c', $letter) - unpack('c', 'A') + 1);
    }
    $num;
}

sub num2ExCol ($) {
    my $num = shift;
    $num =~ /^\d+$/io or die "Invalid number '$num'";
    $num == 0 and die "Can't convert 0 to Excel colmun name.";
    my $col = '';
    do {
        my $subnum = $num % 26;
        $subnum = $subnum == 0 ? 25 : $subnum - 1;
        $col = pack('c', $subnum + unpack('c', 'A')) . $col;
    } while (($num = int(($num - 1) / 26)) > 0);
    $col;
}

my ($mode, $input) = @ARGV;
my $result =
    $mode eq '0' ? exCol2Num $input :
    $mode eq '1' ? num2ExCol $input : die "Unknown mode parameter '$mode'";
print "$result\n";

まぁでもよい問題ですた。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
おいらがやっている会社の名前をひらがな4文字で。

コメント:

トラックバック

このエントリのトラックバックURL: http://harapeko.asablo.jp/blog/2011/11/12/6199562/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。