7 単純に解決: 「とてもローカルな話: 授業の名簿を作る」の後日談

事務は学生の名簿を Excel データでくれて、 それを使って自分なりの名簿を作ったりしているけれど、 Excel のデータが変なルールで作られていて困る、という話を 「とてもローカルな話: 授業の名簿を作る」 に書いた。 昨年度 (2019年度) は、データの形式が変わって、うまく動かなくなった、 という追記もした。
(2019/10/9) どうも変だなあ、と思ったら、 新年度からデータの形式が変わっているんだ。 がーん。作り直し…次の学期からにしよう。

というわけで新学期なので作り直し。

新しいルールは、 姓と名は全角の空白で区切られる、 という至極真っ当なものになっていた (最初からそうして欲しかったな)。

何だ、これならほとんど何も考えなくて済む。 全角空白の場所を探して、その手前までと、その後、として文字列を切り出すだけだ。
meibo2.awk
#!/opt/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;
}
$4 == "現象" {
    GAKUSEKI = $2;
    GAKUBU = $3;
    GAKKA = $4;
    GAKUNEN = $5;
    KUMI = $6;
    BANGOU = $7;
    SHIMEI = $8;
    # 姓と名に分解 (全角空白が区切り)
     i = index(SHIMEI, " ");
    SEI = substr(SHIMEI, 1, i-1);
    NAMAE = substr(SHIMEI, i+1);
    # 氏名の振り仮名は全角空白が区切り文字
    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");
}

Excel データを、 CSV 形式に変換して nantoka.csv という名前で保存してあれば、 次のようにすれば良い。
curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/meibo2.awk
chmod +x meibo2.awk

nkf -w nantoka.csv | ./meibo2.awk > nantoka.tex

pdfplatex nantoka.tex

手で一切修正せずに、スッと出来ました。一件落着。

何でもないことのようだけれど、昔はそれなりに時間をかけてやっていたので、 ちょっと嬉しい。

(まあ、Excel に慣れていれば、全部 Excel のままで処理できるのだろうけれど。 …そうだ、全角空白が入って間延びした氏名が嫌だから自分で名簿を作り直そう、 と考えたのがそもそもの始まりだった。 もしかしたら、何もしなくてもよくなっていたのかもしれない。)



桂田 祐史