作者: Koichi Yamamoto
日時: 2004/1/4(01:42)
こんにちは、山本です。

"HFC01730@... (水羽信男)"さんは書きました:
> 1)今回の僕の作業の具体的な例は次のようなもので、11の改行を欄区切り文字とする
>   unicodeのデータが、空行(←空白行ではないです!)で区切られています。
>  
> 番号:1
> 名前:王贛愚
> よみ1:おうかんぐ
> よみ2:Wang Ganyu
> 生年:1906
> 卒年:-
> 学歴1:清華大学
> 学歴2:コロンビア大学
> 経歴1:大陸
> 経歴2:-
> 雑誌1:○
> 雑誌2:×

unicodeデータということですが、little-endianのプラットフォームで
little-endianのunicodeデータ(UCS2やUTF-16)であると仮定して、
以下のスクリプトを作ってみました。
=====ここから=================================================
# 指定された欄(column; 0,1,2,...)でsort
proc sortfield {filename column} {
    set fd [open $filename]
    fconfigure $fd -encoding unicode
    set data [read $fd 1]
    if [string equal $data \ufeff] { ;# BOMをcancelするための処理
        set data [read $fd]
    } else {
        append data [read $fd]
    }
    close $fd
    set records {}
    foreach i [split [regsub -all -- {\n\n+} $data \0] \0] {
        lappend records [split $i \n]
    }
    set result ""
    foreach i [lsort -index $column -dictionary -increasing $records] {
        append result [join $i \n]\n\n
    }
    return $result
}
=====ここまで=================================================
これを「sortfield.tcl」というテキストファイルに保存して、
コマンドプロンプトからTclのコマンドを直接実行してみてください。

c:\temp>tclsh84
% source sortfield.tcl
% sortfield hoge.txt 2

第一引数にはファイル名を、第二引数にはフィールドの番号(0,1,2,…)を
指定して sortfield プロシージャを実行してください。

ファイルのencodingがutf-8やunicode(big-endian)のときは
読み込み処理を変更してやらないといけませんが、どうでしょうか?

--
Koichi Yamamoto, 
http://homepage3.nifty.com/yamakox/