作者: davi
日時: 2008/6/25(23:27)
みなさん  <  こん??は でび@ここのところの気候でヘロヘロです。

みなさんお元気でしょうか。

ADSLモデムに某国からアタックが山のように来ており、台湾海峡の
海底ケーブルを潜水艦が偶発的な事故で引きちぎってくれることを
願う今日この頃です。

さて、表題の件。
でも、クイックソートのアルゴリズムのお勉強とか、そういう高尚な
お話ではありません。

まだチャンと調べていなくて、ボンヤリ考えているレベルなの
ですが、ユーザが作成する指定ファイルの指示に随って、Unicode
ベースのテキストファイルをソーティングすることを考えています。

要するに、UnicodeでCJK関係の文字があっちこっちにブロックが
作られていて、簡単な操作で一気に部首画数順に並べることが
できないのを、どうにかしたいわけです。
(ハングルもあっちこっちにばらけているし…。)

そのような場合、手続きとしてはどのようにするのが《考え方》
として「楽」or「エレガント」or「技術者の発想から言って正解」
なのでしょうか?

例えばユーザが作成する指定ファイル(list.txt)には

い[Enter]
ろ[Enter]
は[Enter]
に[Enter]
ほ[Enter]
へ[Enter]
と[Enter]
(以下略)

と、ひらがなが「いろは」順で並んでいるとします。

で、(たとえばawkを使うとして―VB.NETでも良いですけど―)

awk -f usort.awk list.txt In_file.txt > Out_file.txt

としたときに、In_file.txtが

いぬ
とちのき
にんじん
はむたろう
ろば
へらぶな
とり
ほらがい

みたいな感じで、Out_file.txtが

いぬ
ろば
はむたろう
にんじん
ほらがい
へらぶな
とちのき
とり

となるようにしたいわけです。

ここで大事なのは、「ちりぬるを」なので「とちのき」が「とり」
よりも前にSORTされて出力される、というところが大切。

なお、前提条件として、「opt_list.txt」には、「In_file.txt」で
用いられている(Enterなどの制御符号以外の)すべての文字が網羅
されて記載されているとします。

いまの所は、中間ファイル方式で

s/い/【DAVI-000001】/g;
s/ろ/【DAVI-000002】/g;
s/は/【DAVI-000003】/g;
s/に/【DAVI-000004】/g;
s/ほ/【DAVI-000005】/g;
s/へ/【DAVI-000006】/g;
s/と/【DAVI-000007】/g;

と、延々と独自コード番号を定義して、DAVIコード(仮番号)に
一括置換した仮出力を出して、その後で、sortfなどの普通の
Sortツールを用いてSortする方法が確実ではあろうなぁ…という
気はしています。

Sort対象のファイルはWeb上で常時運用するものではなく、ローカル
で必要に応じてSortするだけなので、まぁ、遅くても実用上は問題
ないのですが、でも、これじゃあ、あんまりにも泥臭くてかっこ
よくない上、メモリも富豪的に使いそうだしと…。

更に、気になるのが、独自コードに使用する【や】や0-9の数値が、
元のデータにプレーンテキストとして存在した場合、それらが
二重に置換されてしまう危険性です。

これは置換しない、というフック機能みたいのって、スクリプト言語
には存在するのかなぁ、とか。

ホントにこれで良いのかな?と心配です。

他に良い方法ってないでしょうかね?

Office2007のExcelでは100万行くらい扱えるようになったとは言っても、
並べ替え順序指定で数万字のリストに随って並べ直す、ってのは難しそう
です。

でび  http://davi.txt-nifty.com/1984/