11 とてもローカルな話: 授業の名簿を作る

授業を受講する学生の名簿は EXCEL のファイルでもらえるのだけれど、 一つ問題がある。 例えば「桂田 祐史」という氏名が「桂 田 祐 史」のような文字列になっている。 振り仮名をつけたいので、姓と名前を取り出したいのだけれど、 ひとまとめにしてしまっているので、人名に関する常識がないと、 それは出来ない (と思っていた)。 学部名とか、学科名とか、ほぼ自明なデータをつけるくらいならば、 姓と名前を分けたデータを作れば良いのに。

ところで以前どこかで小耳に挟んだのだけど、 姓と名前を取り出す関数 (EXCELの?) を作った、 とのこと。

納得行かなかったけれど、質問もしなかったので、 どういうものか分からないままなのだけど、 名簿作り作業を続けていくうちにふと「こういうことかな?」 というのを思いついて、それを実行してみた。


氏名を構成するすべての文字の間に全角空白を挿入するのではなく、 例えば「大和田漠」は「大和田 漠」に、 「乾雅史」は「 乾  雅 史」にしている。 どうも、 1文字の「○」場合は「 ○  」、 2文字の「○△」場合は「○ △ 」、 3文字の「○△□」場合は「○△□ 」としているようだ。 つまり4文字目は必ず全角空白で、 それより前が姓、それより後が名前としてある。

4文字以上の文字で姓が出来ている場合のルールがどうなっているのか分からないが (例を見たことがないので。4文字以上の場合は、 最初に現れる全角空白が区切りということかなあ?)、 そうでないものについては、単純な処理で姓と名前が分解出来る。


#!/usr/local/bin/gawk -f
BEGIN {
        # CSVファイルなので , がフィールド・セパレーター
        FS = ",";
        # LaTeX ファイルを作る
        printf("\\documentclass[12pt]{jarticle}\n");
        printf("\\usepackage[a4paper,vscale=0.9,hscale=0.8]{geometry}\n");
        printf("\\usepackage{nruby}\n");
        printf("\\usepackage{mymacro2es}\n");
        printf("\\begin{document}\n");
        count=0;
}
{
    GAKUSEKI = $2;
    GAKUBU = $3;
    GAKKA = $4;
    GAKUNEN = $5;
    KUMI = $6;
    BANGOU = $7;
    SHIMEI = $8;
    # 1から3文字目までを取り、全角空白をすべて除く
    SEI = substr(SHIMEI, 1, 3);
    gsub(/ /,"",SEI);
    # 4文字目から後を取り、全角空白をすべて除く
    NAMAE = substr(SHIMEI, 4);
    gsub(/ /,"",NAMAE);
    # 氏名の振り仮名は全角空白が区切り文字
    YOMI = $9; 
    i = index(YOMI," ");
    YOMI1 = substr(YOMI, 1, i-1);
    YOMI2 = substr(YOMI, i+1);
    # 女子かどうか
    FEMALE=$10;
    if (count == 0)
        newtab();
    if (match(FEMALE,"F"))
        printf("\\hline\n%2d & %2d & %2d & \\Ruby{%s}{%s} \\Ruby{%s}{%s} F", GAKUNEN, KUMI, BANGOU, YOMI1, SEI, YOMI2, NAMAE);
    else
        printf("\\hline\n%2d & %2d & %2d & \\Ruby{%s}{%s} \\Ruby{%s}{%s}", GAKUNEN, KUMI, BANGOU, YOMI1, SEI, YOMI2, NAMAE);
    for (i=0;i<15;i++) printf("& ");
    printf("\\\\\n");
    count++;
    if (count == 30) {
        newpage();
        count=0;
    }
}
function newpage() {
        printf("\\hline\n\\end{tabular}\n\\newpage\n");
}
function newtab() {
        printf("\\begin{tabular}[htbp]{|r|r|r|l|");
        for (i=0;i<15;i++) printf("p{1zw}|");
        printf("}\n");
}
END {
        if (count != 0)
                printf("\\hline\\end{tabular}\n");
        printf("\\end{document}\n");
}

修正版の入手
curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/meibo.awk

(2019/10/9) どうも変だなあ、と思ったら、新年度からデータの形式が変わっているんだ。 がーん。作り直し…次の学期からにしよう。

桂田 祐史
2020-04-05