perlで氏名をあいうえお順でsortしたいと思います。
何か、いい方法がございましたらお教え下さい。
<データの中身>
山本 哲也 TETSUYA YAMAMOTO
中村 通 TOURU NAKAMURA
山田 太郎 TAROU YAMADA
(以下、続く)
---------------------------------------------------------
(株)宇部情報システム 技術システム開発部
光田 一善(みつだ かずよし)
<内線:8374-385>
<E-mail:u90...@uis-inf.co.jp>
----- Tel. 0836-22-0124 --------- Fax. 0836-21-4051 -----
In article <4dig91$h...@UINTER.uis-inf.co.jp> u90...@uis-inf.co.jp (Kazuyoshi Mitsuda) writes:
perlで氏名をあいうえお順でsortしたいと思います。
何か、いい方法がございましたらお教え下さい。
まあ取り敢えず
・「氏名」にこだわらずにプログラムする
・漢字のデータから読を解釈するのは特に人名の場合人間でも難しいので諦める。
という線で考えた方がいいと思います。
ということで、
・ローマ字の文字列に対してアイウエオ順にソートする。
というのが「いい方法」かな?
で、定石としては
(1)ローマ字を解釈するオートマトンを作る
(入力された文字列がローマ字かなら「真」ローマ字でないなら「偽」
を出力するプログラムをつくる。またはローマ字を実際に仮名に直すプ
ログラムを作って、その文字列に対してソートをかける手もあります。)
(2)作ったオートマトンを利用して、2つのローマ字列のアイウエオ順の大
小関係を出力するサブルーチンを作る。
(3)入力列に適した形にサブルーチンを直して
sort サブルーチン名 文字列の配列
により配列内をソートする。
と言うのがいいのではないでしょうか?
ただ、外国人などローマ字として解釈されない氏名が入力された場合の処理と
か、まだ考えなければならないことがあると思います。
因に以前 IP アドレスの列を入力したとき、それをソートするプログラムを作っ
たことがありますので、付録につけますので、参考にしてください。
# '.' では split しないのでちょっと苦労しました。
#!/usr/local/bin/perl
@s=<>;
@sorted=sort byaddr @s;
print @sorted;
sub byaddr {
$_=$a;
s/\./:/g;
local(@c)=split(':');
$_=$b;
s/\./:/g;
local(@d)=split(':');
local($i);
local($r)=0;
for($i=0; ($i < 4)&&($r == 0) ; $i++){
$r= ( $c[$i] <=> $d[$i] );
}
return($r);
}
一橋大学情報処理センター 助手 坂本 直志 (JPNIC ハンドル NS023JP)
〒186 東京都国立市中2ー1 e-mail: saka...@cc.hit-u.ac.jp
Hiroshi> 一旦ひらがなに変換してから、単純に文字コードでソートするという
Hiroshi> 程度なら、変換表さえ作ってしまえばあとは単純な置換の繰り返し
Hiroshi> だけでできますね。
ひらがなに変換するなら,kakasiと言うskkの辞書を利用したフリーウェア
があったと思いますが..
で,日本語のソートですが昔真剣に考えてけっこうめんどうなことに気がつき
ました.
かか(仮果)
かかし(案山子)
かが(加賀)
かん(感)
がか(画家)
コード的にソートするならば上の順番でいいのですが,国語辞典では,
かか(仮果)
かが(加賀)
がか(画家)
かかし(案山子)
かん(感)
とかなるのが多いですよね(ものによって違いますが).このように並べ換るに
は濁点を取る関数も必要になるでしょう.
--
沼田いっせい@JAIST
☆寝坊したら,すごくソンした気がした.
は文字コード順でいいけど
オイル
オール
は文字コード順だと変だったりしますから、濁音、半濁音を外すだけでは
まだ足りませんね。電話帳の順序はまた特殊だったりするし。
# こういうことを真面目に考えるとかなり複雑になるから、
# 「コード順でいい程度なら」と限定して逃げていた私
--
OGAWA, Hiroshi(sa...@kangaku-u.ac.jp)
Associate Professor, Department of Economics, Kanto-Gakuen Univ.
http://job-offer.slis.flet.mita.keio.ac.jp/