みなさん < こん??は でび@ここのところの気候でヘロヘロです。
みなさんお元気でしょうか。
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/