コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2016年3月30日 >>> 2016年3月17日
link もっと後

2016年3月30日

表計算ソフトの列名変換問題

昨日のhdkさんの日記(リンク)を見て、自分も挑戦してみました。

元ネタは2011年のブログ(リンク)ですね。

列名を数字(atod)と数字を列名(dtoa)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int atod(char *str)
{
        int len = strlen(str);
        int r = 0;
        int i;

        for (i = 0; i < len; i++) {
                r *= 26;
                r += str[i] - 'A' + 1;
        }

        return r;
}

void dtoa(int r, char *buf)
{
        char tmp[256];
        int p = 0;
        int i, len;

        memset(tmp, 0, sizeof(tmp));
        r -= 1;
        while (r >= 0) {
                tmp[p] = 'A' + (r % 26);
                r = r / 26 - 1;
                p++;
        }

        len = strlen(tmp);
        for (i = 0; i < len; i++) {
                buf[len - i - 1] = tmp[i];
        }
}

int main(int argc, char *argv[])
{
        int dir = atoi(argv[1]);
        char *str = argv[2];
        int r;
        char buf[256];

        switch (dir) {
        case 0:
                r = atod(str);
                printf("%d\n", r);
                break;
        case 1:
                memset(buf, 0, strlen(buf));
                dtoa(atoi(str), buf);
                printf("'%s'\n", buf);
                break;
        }

        return 0;
}

掛かった時間は正確に計ってないですが、atodの方が10分くらいで、dtoaの方が1時間くらいだったと思います。

2文字目以降を求める式(r = r / 26 - 1)を思いつくのに、予想以上に時間が掛かりました。

動作チェック
$ for i in `seq 1 100` `seq 650 750` `seq 17550 17650`; do echo $i `./a.out 1 $i`; done | egrep "[ABYZ]'"
1 'A'
2 'B'
25 'Y'
26 'Z'
27 'AA'
28 'AB'
51 'AY'
52 'AZ'
53 'BA'
54 'BB'
77 'BY'
78 'BZ'
79 'CA'
80 'CB'
650 'XZ'
651 'YA'
652 'YB'
675 'YY'
676 'YZ'
677 'ZA'
678 'ZB'
701 'ZY'
702 'ZZ'
703 'AAA'
704 'AAB'
727 'AAY'
728 'AAZ'
729 'ABA'
730 'ABB'
17550 'YXZ'
17551 'YYA'
17552 'YYB'
17575 'YYY'
17576 'YYZ'
17577 'YZA'
17578 'YZB'
17601 'YZY'
17602 'YZZ'
17603 'ZAA'
17604 'ZAB'
17627 'ZAY'
17628 'ZAZ'
17629 'ZBA'
17630 'ZBB'

二桁目がAになるとき、二桁目がZになるとき、三桁目がAになるとき、三桁目がZになるとき、いずれも特におかしくならないので、他の桁数でもたぶん大丈夫でしょう。

編集者:すずき(2016/03/31 00:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2016年3月30日 >>> 2016年3月17日
link もっと後

管理用メニュー

link 記事を新規作成

<2016>
<<<03>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント5件

  • link 25年10月6日
    すずきさん (10/10 13:14)
    「ですね。ccはもはやコンパイラというより...」
  • link 25年10月6日
    hdkさん (10/10 08:27)
    「ただのHello, worldでも試して...」
  • link 25年9月29日
    すずきさん (10/03 00:29)
    「なんと、メタパッケージ入れてなかったです...」
  • link 25年9月29日
    hdkさん (10/02 06:51)
    「あれ、dkmsは自動ビルドされるのが便利...」
  • link 20年8月24日
    すずきさん (08/30 22:06)
    「ですね、自分も今はPulseAudioを...」

最近の記事20件

  • link 23年4月10日
    すずき (10/10 01:20)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linux kernel 2.4 for ARMが...」
  • link 25年10月6日
    すずき (10/10 01:19)
    「[makeのデフォルトルールのリンクはLDを使わない] 目次: LinuxMakefileの達人には常識かもしれませんが、ma...」
  • link 09年11月3日
    すずき (10/09 23:58)
    「[Automakeの出力を簡潔化する方法がわからない] 目次: Linux最近はMakefileを自作せずに、GNU Tool...」
  • link 18年7月2日
    すずき (10/09 23:56)
    「[libtoolが見つからないときの謎エラー] 目次: LinuxRaspberry Pi 3を持っているのですが、あまり速く...」
  • link 15年12月27日
    すずき (10/09 23:55)
    「[GNU autotools入門 その2] 目次: LinuxGNU autotoolsは簡単なんですが、使い始めるまではかな...」
  • link 15年12月26日
    すずき (10/09 23:55)
    「[GNU autotools入門 その1] 目次: Linuxソースコードのビルドシステムは多々あって決定打はない(個人的には...」
  • link 19年9月17日
    すずき (10/09 23:54)
    「[makeは環境変数とmake変数の挙動が違う] 目次: Linuxシェルからmakeに渡す環境変数とmake変数の関係を知ら...」
  • link 09年4月8日
    すずき (10/09 23:53)
    「[同じ環境のPC2台なのにsedのビルド成功/失敗が変わる?] 目次: Linuxサーバでプログラムをmakeすると、挙動が違...」
  • link 15年12月28日
    すずき (10/09 23:50)
    「[GNU autotools入門 その3] 目次: LinuxGNU autotoolsの話を書いていて思い出したのですが、a...」
  • link 19年10月14日
    すずき (10/09 23:50)
    「[linux-nextでdirtyがバージョン情報に付く仕組み] 目次: LinuxLinuxというかlinux-nextです...」
  • link 15年6月3日
    すずき (10/09 23:49)
    「[ビルド高速化ツールccache] 目次: Linux巨大なプロジェクト(Androidなど)をコンパイルするときに欠かせない...」
  • link 15年6月5日
    すずき (10/09 23:49)
    「[バージョン管理システムとmakeの相性] 目次: Linux前々から感じていたのですが、この2者は非常に相性が悪いと思います...」
  • link 25年10月4日
    すずき (10/06 02:52)
    「[Linuxのprocファイルシステムの実装 - /proc/pid/ioのopenとread] 目次: Linux以前、Li...」
  • link 25年2月19日
    すずき (10/05 22:30)
    「[LinuxのI/O統計情報が読めないプロセスの謎を追う] 目次: Linux前回はsystemd --userの/proc/...」
  • link 25年10月1日
    すずき (10/05 15:24)
    「[V4L2でUSBカメラのキャプチャをする方法] 目次: LinuxV4L2(Video for Linux 2)は多才で全て...」
  • link 24年12月6日
    すずき (10/05 14:53)
    「[ffmpegでYUVのrawvideo画像を生成、表示する方法] 目次: LinuxFFMPEG(ffmpeg)を使ってYU...」
  • link 23年6月1日
    すずき (10/05 13:59)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 25年10月3日
    すずき (10/05 01:34)
    「[udevでデバイスの属性を調べる方法] 目次: Linuxいつも忘れるudevの使い方メモです。udevadmでデバイス属性...」
  • link 25年9月27日
    すずき (10/03 09:11)
    「[KernelSharkのLatency列の5桁目] 目次: Linux前回(2025年9月20日の日記参照)はKernelS...」
  • link 25年9月20日
    すずき (10/02 02:34)
    「[KernelSharkのLatency列] 目次: LinuxKernelSharkのイベント情報を見ると「Latency」...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 2025年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 10/10 13:14