作者: Koichi Yamamoto
日時: 2004/1/23(20:59)
こんにちは、山本です。

"HFC01730@... (水羽信男)"さんは書きました:
> ところで、sortfield.tclの結果は、コンソール画面に文字
> バケもせず、表示され、これは素直に感動しました。という
> のは、コマンドラインで日本語入力をしても、王贛愚の贛な
> どは?となってしまうからです。ただリダイレクトで、ソート
> 結果をファイルに保存ができないのが、残念です。

Windows2000のコマンドプロンプトでtclshを動かすと「?」文字が
表示されますから、wishかtkconを使っていらっしゃるようですね。
これらのコンソールはTkで実装されており、unicodeの文字を
正しく表示してくれます。

ソート結果をunicodeテキストファイルに出力するのであれば、

proc unicodeout {text filename} {
    set fd [open $filename w]
    fconfigure $fd -encoding unicode
    puts $fd \ufeff$text  ;# BOM(U+FEFF)付きでファイル出力
    close $fd
}

みたいなプロシージャを作って、

unicodeout [sortfield hoge.txt 3] hogehoge.txt

としてやると便利です。


> % proc sortfield {filename column encoding} {;set fd
>  [open $filename];fconfigure $fd -encoding $encoding;
> set data [lsearch -all -regexp -inline [split [read 
> $fd] \n] .+];puts [join [lsort -index $column $data]
>  \n];close $fd;}
> で、ファイルの区切りを半角の空白ではなく、たとえば/
> (スラッシュ)に変更することなどはできるのでしょうか。

文脈から察すると↓のように各要素の区切り文字として
スラッシュを使っている場合の質問だと思います。

例:15/李広田/りこうでん/Li Guangtian/1906/1968/北京大学/?/大陸/-/×/×/

この場合、splitコマンドを使って / で分割するようにします。

set data2 {}
foreach i $data { lappend data2 [split $i /] }


> ただこれらの疑問は、自分で少しずつ解決してゆくつもり
> です。具体的にまた質問させていただくかも知れませんが、
> 今回はまずは動作確認の報告とお礼まで。

おせっかいかと思いましたが、たくさんあるTclのコマンドを一度に
把握するのも大変ですから、ヒントになればと思い、上記スクリプトを
記載しておきました。

いままでのところ、
Tclだけでも十分対処できるような話でしたので全てTclで説明していますが、
もっと複雑な作業を行うときはTclだけでなくPerlなど他のスクリプト言語を
組み合わせるとよりよいだろうと思います。Tclで多言語処理を行っておき、
Perlやawkで複雑なテキスト処理を行うというのも便利だと思いますよ。

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