こんにちは、山本です。
"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/