リストの並び順に従ってソートNo.06662
cho-bi さん 11/07/02 22:23
 
あるリストの並び順に従ってソートをすることは可能でしょうか。
あるファイルの語彙索引を作っているのですが、漢字で始まる語彙は漢和辞典の並び
順、つまり部首順かつ同一部首の場合は画数順という順番で並べなければなりません。
ユニコード漢字を部首順かつ同一部首の場合は画数順で並べてあるデータは手元にあ
りますので、ファイルの語彙をこの順番に並べ替えられればいいなと思うのですが、
そういったことは秀丸のマクロなどで可能でしょうか。

[ ]
RE:06662 リストの並び順に従ってソートNo.06665
山紫水明 さん 11/07/03 08:50
 
 cho-biさん,

>あるリストの並び順に従ってソートをすることは可能でしょうか。
>あるファイルの語彙索引を作っているのですが、漢字で始まる語彙は漢和辞典
>の並び順、つまり部首順かつ同一部首の場合は画数順という順番で並べなけれ
>ばなりません。

 正式のコメントは担当者からされると思いますが,とりあえずということで。
 ユニコード漢字の排列順についての知識はありませんが,一度,
全選択→「変換」→「ソート」で「Uunicode の文字コードで比較」
で試してみられたらいかがでしょう。

                          山紫水明(ユーザー)
                          SANSHISUIMEI

[ ]
RE:06665 リストの並び順に従ってソートNo.06667
cho-bi さん 11/07/03 12:21
 
山紫水明 様

 コメントを頂きましてありがとうございます。

 実は現在その「Unicode の文字コードで比較」でソートしているのですが、Unicod
eの文字コード順は基本的には「部首順かつ同一部首の場合は画数順」となっていま
すが、微妙に違っているところがあって、それらは手作業で修正している状況です。
 これでもどうにか作業はできるのですが、手作業で間違いも起こりますしもっと効
率的にソートできないかなと思った次第です。
 マクロについてはあまり詳しい知識はないのですが、あるリストを指定してそのリ
ストに書かれている順番通りに並べ替えられれば、一度自分なりのリストを作ってお
けばまた再利用もできますし便利だなと思いました。

 なにかヒントやいいソフトなどがありましたら、お教え頂ければ幸いです。

[ ]
RE:06667 リストの並び順に従ってソートNo.06668
秀まるお2 さん 11/07/04 09:04
 
 マクロでソートの処理を作ることは可能だとは思いますが、重すぎて実用にな
らない可能性が高いような気がします。

 (ソートする対象のデータの大きさにもよりますが)

 C++言語で変換モジュールという形で作ることなら可能だと思います。

 ソートのルールに使う「部首順かつ同一部首の場合は画数順」のデータがもし
一般に公開してもいいか、または僕に提供してもよくて、しかも最終的に完成し
たソートの処理も一般公開して他のユーザー様に使われてしまってもいいのでし
たら、そういう変換モジュールを僕の方で作ってもいいです。

[ ]
RE:06668 リストの並び順に従ってソートNo.06669
cho-bi さん 11/07/04 15:38
 
秀まるお 様

 コメントを頂きましてありがとうございます。
 変換モジュールを作って頂けるとのこと、大変ありがたく厚く御礼を申し上げます。
お忙しいところ本当に申し訳ありませんが、急ぎませんのでお時間がもしあればとい
うことで、お願いできればと思います。
 もちろん一般公開して頂いて他の方もお使い頂くということで結構です(使われる
方は少ないかもしれませんが)。
 「部首順かつ同一部首の場合は画数順」のデータは別便でお送りいたします。よろ
しくお願いいたします。

[ ]
RE:06669 リストの並び順に従ってソートNo.06670
IKKI さん 11/07/04 17:29
 
こんにちは。ユーザーの IKKI です。横から失礼します。

まるおさんが C++ で変換モジュールをお作りになるということで、対抗して (?)
Ruby で同じことをするプログラムを書いてみました。
# 速度では敵わないかもしれませんが、短さでは勝っているはず…。

語彙索引を作るようなお仕事をなさっているのでしたら、Ruby などのスクリプト言
語を使えるようにすることをおすすめします。
ちょっとしたプログラムを自分で書くことができ、仕事が大いに捗ります。
以下、ご参考までに。


●プログラム (sort_by_list.rb)
----------------------------------------
$KCODE = "u"
n = Hash.new(0)
IO.readlines("list.txt").each_with_index{|v, i| n[v.chomp] = i}
puts ARGF.readlines.sort_by{|w| w.chomp.split(//).map{|c| n[c]}}
----------------------------------------

●順序定義ファイル (list.txt)
----------------------------------------










----------------------------------------

●処理対象ファイル (data.txt)
----------------------------------------
九三八二七四
八九一二三
五六一四三五
七四九一五
〇一〇四一五
一三七四五
四三九七五三
六一四三七一
〇九五
三九八
二九七四
----------------------------------------

●実行方法
----------------------------------------
ruby sort_by_list.rb < data.txt > result.txt
----------------------------------------

●結果 (result.txt)
----------------------------------------
〇一〇四一五
〇九五
一三七四五
二九七四
三九八
四三九七五三
五六一四三五
六一四三七一
七四九一五
八九一二三
九三八二七四
----------------------------------------

[ ]
RE:06670 リストの並び順に従ってソートNo.06671
秀まるお2 さん 11/07/04 18:05
 
 Rubyでそんなに簡単に出来るのでしたらRubyでやっていただいた方がいいよう
な気がします。

 僕に送っていただいた部首データは、

 文字コード,文字,部首番号-画数

 みたいな感じになってたので、それをRubyさん用のに変換するとしたら、置換
コマンドにて、

検索:  ^.+,(.+),.+$
置換:  \1

 として全置換すればいいです。そうすれば文字だけのデータになるのでそれを
別のファイル名で保存して使ってください。

 もしRubyさんでうまくいかないようでしたら、僕の方でのソートモジュールを
完成させようと思います。

[ ]
RE:06670 リストの並び順に従ってソートNo.06672
cho-bi さん 11/07/04 18:18
 
IKKI 様

 どうもありがとうございます。
 Ruby は今まで使ったことがないのですが、この機会にぜひ勉強してみたいと思い
ます。ありがとうございます。

 ところで実は、IKKI様がお作りになったマクロ「Hidematter」を愛用させて頂いて
おります。この機会に御礼を申し上げます。

[ ]
RE:06671 リストの並び順に従ってソートNo.06673
cho-bi さん 11/07/04 18:20
 
秀まるお 様

 了解しました。
 これからRuby をインストールしてみてやってみます。結果はまた報告させて頂き
ます。ありがとうございました。

[ ]
RE:06673 リストの並び順に従ってソートNo.06674
cho-bi さん 11/07/04 18:39
 
秀まるお 様
IKKI 様

 Ruby をインストールして試してみました。
 でも私の使い方が悪いせいか、うまくいきませんでした…。

 次のようなエラーが出てしまいました。

c:\>C:\Ruby\bin\ruby.exe C:\Data\sort_by_list.rb < C:\Data\data.txt > C:\Use
rs\any\Desktop\result.txt
C:/Data/sort_by_list.rb:1: warning: variable $KCODE is no longer effective;
ignored
C:/Data/sort_by_list.rb:4:in `split': invalid byte sequence in Windows-31J
(ArgumentError)
        from C:/Data/sort_by_list.rb:4:in `block in <main>'
        from C:/Data/sort_by_list.rb:4:in `each'
        from C:/Data/sort_by_list.rb:4:in `sort_by'
        from C:/Data/sort_by_list.rb:4:in `<main>'

 Ruby はC:\Ruby\binに、またsort_by_list.rbなどのファイルはC:\Dataにあり、so
rt_by_list.rb内のlist.txtは"C:\\Data\\list.txt"と記載しています。

 すみません。お時間がありましたらお教え下さい。

[ ]
RE:06674 リストの並び順に従ってソートNo.06675
IKKI さん 11/07/04 19:33
 
cho-bi さん、こんにちは。IKKI です。
# Hidematter のご利用ありがとうございます (^^

# すでに秀丸の話題ではないので、ここで話を続けることは不適切と思いますが
# もう少しだけ場所を貸してください。 m(_ _)m

cho-bi さんは Windows Vista/7 で Ruby 1.9 をお使いのようですね。
その場合は次のようにしたら行けると思います。

●プログラム (sort_by_list.rb)
----------------------------------------
n = Hash.new(0)
IO.readlines("list.txt").each_with_index{|v, i| n[v.chomp] = i}
puts ARGF.readlines.sort_by{|w| w.chomp.split(//).map{|c| n[c]}}
----------------------------------------

●実行方法
----------------------------------------
ruby -U sort_by_list.rb < data.txt > result.txt
----------------------------------------

いかがでしょうか。
(すみませんが、手元に Ruby 1.9 の環境がないので動作確認していません)

Ruby に関する質問は ruby-list に投げたら答えてもらえると思います。
http://www.ruby-lang.org/ja/community/mailing-lists/

[ ]
RE:06674 リストの並び順に従ってソートNo.06676
h-tom さん 11/07/04 21:23
 

h-tom です。

>C:/Data/sort_by_list.rb:1: warning: variable $KCODE is no longer effective;
>ignored
>C:/Data/sort_by_list.rb:4:in `split': invalid byte sequence in Windows-31J
>(ArgumentError)
>        from C:/Data/sort_by_list.rb:4:in `block in <main>'
>        from C:/Data/sort_by_list.rb:4:in `each'
>        from C:/Data/sort_by_list.rb:4:in `sort_by'
>        from C:/Data/sort_by_list.rb:4:in `<main>'
>
> Ruby はC:\Ruby\binに、またsort_by_list.rbなどのファイルはC:\Dataにあり、so
>rt_by_list.rb内のlist.txtは"C:\\Data\\list.txt"と記載しています。
>
> すみません。お時間がありましたらお教え下さい。
読み込ませる、list.txtと、data.txtの文字コードは何になります?
ruby 1.9は、Windowsの場合、外部ファイルのエンコードとして、Windows-31J(Shift
_JIS)
を期待しています。
文字コードが、Windows-31J(Shift_JIS)と異なる場合は、指定しないと、うまく動き
ませんよ。

UTF8なら、
  Encoding.default_external = Encoding::UTF_8
UTF16(LE)なら、
  Encoding.default_external = Encoding::UTF_16LE
を、スクリプトの先頭に、入れてみてください。

[ ]
RE:06676 リストの並び順に従ってソートNo.06677
秀まるお2 さん 11/07/04 21:39
 
 こちらに送っていただいた部首データですが、サロゲートペアを使った4バイ
トユニコード文字も多数含まれているようでした。

 Rubyさん大丈夫ですかね。

 僕は大丈夫じゃないので、今から4バイトユニコード対応に直そうとしてたり
しますけども。

[ ]
RE:06677 リストの並び順に従ってソートNo.06678
秀まるお2 さん 11/07/04 22:06
 
>  僕は大丈夫じゃないので、今から4バイトユニコード対応に直そうとしてたり
> しますけども。

 今直してアップロードしました。せっかく作ったのでよかったら使って欲しい
所です。

http://hide.maruo.co.jp/software/bin3/sort200.zip

 でダウンロード出来ます。これを解凍して出てくるsoft.hmfを秀丸エディタの
プログラム用フォルダにコピーして、「動作環境・編集・変換」の所で追加して
やってください。

 で、ソートしたい範囲を選択して、「編集・変換・カスタムソート...」を実
行する訳ですが…

 その前に、部首データは、1行に1文字だけの形に変換が必要です。

検索:  ^.+,(.+),.+$
置換:  \1

 の正規表現で置換して、その結果をUTF-16(BOMあり)形式で別途保存しておく
必要があります。それを、ソートダイアログボックスの「並び順をファイルで指
定」の所で指定してくださ。

 「Unicodeの文字コードで比較」もONでないとうまくいかないです。

 あんまり込み入ったテストはしてないので、もしうまくいかない場合はまた連
絡ください。(それかRubyでやっていただくか)

[ ]
RE:06675 リストの並び順に従ってソートNo.06679
cho-bi さん 11/07/04 23:15
 
IKKI 様

 どうもありがとうございます。

 Ruby のバージョンを書いていなくて申し訳ありませんでした。rubyinstaller-1.9.
2-p180.exeをダウンロードしておりました。
 おっしゃるとおり、すでに秀丸の話題ではないのに申し訳ありませんが、御礼とや
ってみた結果だけ報告させて頂きます。

 御指示通りにsort_by_list.rbを書き換え、また実行コマンドも変更しましたが、
やはりエラーが出てしまいました。
C:/Data/sort_by_list.rb:4:in `readlines': "\xFF" on Windows-31J (Encoding::I
nvalidByteSequenceError)

 今回Ruby を教えて頂いていろいろ使えそうですので、これからもう少し勉強して
いきたいと思います。
 本当にどうもありがとうございました。

[ ]
RE:06676 リストの並び順に従ってソートNo.06680
cho-bi さん 11/07/04 23:15
 
h-tom 様

 コメントを頂きまして、どうもありがとうございます。

 IKKI様もおっしゃっているように、すでに秀丸の話題ではないのに申し訳ありませ
んが、御礼とやってみた結果だけ報告させて頂きます。

 UTF_16LEの場合とUtf-8の場合と両方で試してみました。
 data.txt、list.txt、いずれもUTF_16にしてEncoding.default_external = Encodi
ng::UTF_16LEとした場合、下記のエラーが出てしまいました。
 C:/Data/sort_by_list.rb:3:in `readlines': ASCII incompatible encoding need
s binmode (ArgumentError)
        from C:/Data/sort_by_list.rb:3:in `<main>'

 一方、data.txt、list.txt、いずれもUtf-8にしてEncoding.default_external = E
ncoding::UTF_8とした場合、エラーは出ずに成功しましたが、ソート結果は思うよう
な結果ではなく、list.txtの順番通りではありませんでした。

 IKKI様への返信でも書かせて頂きましたが、 今回Ruby を教えて頂いていろいろ
使えそうですので、これからぜひ勉強していきたいと思います。
 本当にどうもありがとうございました。

[ ]
RE:06678 リストの並び順に従ってソートNo.06681
cho-bi さん 11/07/04 23:16
 
秀まるお 様

 お作り頂いた変換モジュール、さっそく試してみました。
 結果は完璧でした。こんなに早くに作って下さるとは夢のようです!!
 並び順ファイルをいろいろ工夫するとさまざまなソートができそうで、さまざまな
状況で使えそうです。
 本当にどうもありがとうございました。

[ ]
RE:06681 リストの並び順に従ってソートNo.06682
秀まるお2 さん 11/07/05 09:36
 
 かなり急いで作ったのですが、バグが出てないようでよかったです。
 (速度的にはかなり手抜きがあるので遅いとは思いますが)

 並び順を指定する用のファイル(送っていただいたファイルのbushukakusu.
txtを正規表現置換で変換した物)を添付した形で、この変換モジュールをうち
のライブラリにアップロードしたいんですが、それはいいですよね。

[ ]
RE:06682 リストの並び順に従ってソートNo.06683
cho-bi さん 11/07/05 09:51
 
秀まるお 様

>  並び順を指定する用のファイル(送っていただいたファイルのbushukakusu.
> txtを正規表現置換で変換した物)を添付した形で、この変換モジュールをうち
> のライブラリにアップロードしたいんですが、それはいいですよね。

 はい、もちろん結構です。私以外にも便利に使われる方がいらっしゃるかもしれま
せんので、とてもうれしいです。
 本当にどうもありがとうございました。

[ ]
RE:06683 リストの並び順に従ってソートNo.06684
秀まるお2 さん 11/07/05 10:07
 
 データのご提供ありがとうございます。一応、cho-bi様からご提供いただいた
データってことだけ記載してアップロードさせていただきます。

[ ]
RE:06684 リストの並び順に従ってソートNo.06687
colder さん 11/07/05 23:28
 
colderです

> データのご提供ありがとうございます。一応、cho-bi様からご提供いただいた
>データってことだけ記載してアップロードさせていただきます。

早速ダウンロードしてこのデータを見たところ、164ヶ所数字が紛れ込んでいます。
このまま使うと数字の並びがおかしくなります。
一応報告しておきます。


[ ]
RE:06687 リストの並び順に従ってソートNo.06689
cho-bi さん 11/07/06 09:04
 
colder 様

> 164ヶ所数字が紛れ込んでいます。

 確認しましたら私が加工した元のデータから数字が残っておりました。確認不足で
申し訳ありません。

秀まるお 様

 お手数をお掛けいたしますが、数字部分を削除して頂ければ幸いです。よろしくお
願いいたします。

[ ]
RE:06689 リストの並び順に従ってソートNo.06691
秀まるお2 さん 11/07/06 10:07
 
 僕もまったく確認してませんでした。大変失礼しました。

 とりあえず、「1行に1文字」の形式になってることと、0-9の数字が入って
ないことだけ確認しました。これでアップロードしなおしさせていただきます。

[ ]