変換モジュールのブロック範囲ソートNo.22100
マボカル さん 06/11/02 13:07
 
こんにちは。マボカルです。いつも変換モジュールのソートを使わせて
頂いております。

http://hide.maruo.co.jp/lib/hmconv/sort102.html

一つ要望ですが、ブロック指定した文字列を基準にソート出来るように
機能を追加することはできるでしょうか?そうするともっと活用範囲が
広がると思うのですが。

勿論ブロック範囲のソートといっても、ブロック範囲の文字列を基準と
するだけで、各行の文字列の内容が変わってしまう動きを言っている
わけではありません。例えば以下のようなデータがあるとして、

番号1 わじま 32歳 男
番号2 すずき 29歳 女
番号3 たなか 57歳 男
番号4 かとう 45歳 男
番号5 あらき 38歳 女

年齢を基準にソートさせたい場合は、年齢の範囲だけブロック指定して
ソートを行い、

番号2 すずき 29歳 女
番号1 わじま 32歳 男
番号5 あらき 38歳 女
番号4 かとう 45歳 男
番号3 たなか 57歳 男

のような結果で表示させ、名前を基準にソートさせたい場合は名前の
範囲だけブロック指定してソートを行い、

番号5 あらき 38歳 女
番号4 かとう 45歳 男
番号2 すずき 29歳 女
番号3 たなか 57歳 男
番号1 わじま 32歳 男

のように表示する方法です。そのなことエクセルを使えばいいじゃ
ないかという話かもしれませんが、エディタでの一貫した作業が何かと
都合が良いので要望を出しました。技術的に可能でしたら、機能追加の
ほうご検討よろしくお願いします。

[ ]
RE:22100 変換モジュールのブロック範囲ソNo.22103
Iranoan さん 06/11/02 13:50
 
 マボカルさん今日は、Iranoan です。
> 一つ要望ですが、ブロック指定した文字列を基準にソート出来るように
> 機能を追加することはできるでしょうか?そうするともっと活用範囲が
> 広がると思うのですが。
 反対はしませんが、基準としたいブロックを「BOX 範囲選択」+コピー&ペー
ストで先頭に持ってこれば良いのではないでしょうか? あまりに行が長いと上
手くいきませんが。

[ ]
RE:22100 変換モジュールのブロック範囲ソNo.22104
ENCODINGSHIFTJIS さん 06/11/02 14:09
 
1.ソートキー列を行頭に コピー
2.ソート
3.ソートキーを削除
の 秀丸マクロを作れると思いますが。

テキストでデータ処理の時代は彼方に過ぎ去りし

無償ながら強力なログ解析ツール
Log Parserを活用する
http://www.atmarkit.co.jp/fwin2k/operation/logparser1/logparser1_01.html

Windows PowerShell
http://d.hatena.ne.jp/kasaisyuji/20061101/1162384389

OpenOffice
http://www.forest.impress.co.jp/lib/offc/document/offcsuite/openoffice.html

( NET のコンパイル言語も Express版は無償です、場違い?)

[ ]
RE:22103 変換モジュールのブロック範囲ソNo.22105
マボカル さん 06/11/02 14:20
 
Iranoanさん

ありがとうございます。

> 反対はしませんが、基準としたいブロックを「BOX 範囲選択」+コピー&ペー
>ストで先頭に持ってこれば良いのではないでしょうか? あまりに行が長いと上
>手くいきませんが。

私も基本には既存の機能を最大限に活用して、あれこれと工夫して
使うようにしていますが、ご指摘のような方法も行が多すぎるファイル
だとコピーして行頭に貼り付けるまで時間が掛かってしまいます。

現在はそれを短縮するために、正規表現を利用して編集後にソートの
作業を行っていますが、作業の都合上基準となる文字列を頻繁に変え
なければならないので、ソートの前にいちいち編集作業をするのが
大変になるというのが本音です。それとソート後は行頭にもっていった
文字列を再度もとの位置へ戻さなければならないこともあり、それも
面倒です。

結局エクセルのような表編集プログラムを使えばよいことになるかも
しれませんが、それだと検索の面でエディタのように柔軟な動きを
求められないといった問題点もあります。エクセル以外のほかの
プログラムがあるとしても、OSの問題(韓国語XP使用)、ユニコード
対応の問題など、問題がいろいろ考えられます。

現在の作業では秀丸エディタの英語版を色々と対応してもらっている
ので、作業をする上で最も問題の少なく、活用範囲が広いメインソフト
として使わせていただいています。

一応変換モジュールですので、秀丸エディタの基本機能として追加
されるものでもありませんので、技術的に問題がなければ、比較的
柔軟に機能追加が出来るのではという考えで投稿しました。

私が変換モジュールを作ることが出来れば一番いいのですが、それは
未知の領域です。マクロ文を書いたり、既存のマクロを作業内容に
あわせて書き換えたりといったレベルですね。

こういった機能の需要はあまりないのでしょうかね?
とにかくご意見ありがとうございました。

[ ]
RE:22104 変換モジュールのブロック範囲ソNo.22106
マボカル さん 06/11/02 14:35
 
ENCODINGSHIFTJISさん

ありがとうございます。

>1.ソートキー列を行頭に コピー
>2.ソート
>3.ソートキーを削除
>の 秀丸マクロを作れると思いますが。

Iranoanさんへの返事とも関連しますが、このような一連の作業を
マクロで組むとしても、ファイルが大きいと、1のコピーの段階で
時間が掛かってしまいそうな気がします。でもマクロですからそれ
ほど時間がかかるものでもないでしょうか?汎用性を考えて作ると
すればブロック範囲指定後、マクロを実行して、マクロではブロック
範囲をコピー → 行頭へコピー → ソート → 貼り付けた行頭部分のみ
削除といった動きになるでしょうか。

>テキストでデータ処理の時代は彼方に過ぎ去りし

そうなんですか。私は文系でコンピュータを言語研究に活用することが
主ですので、あまり専門的には勉強しておりません。そのレベルだと
テキストを確認しながら編集するということをまず考えてしまい
ますね。勿論ファイルが小規模の場合はそれでいいかもしれませんが、
実は最近は私も欲が出て、膨大なテキストを処理するようになってきた
ので、このような問題が出ているのかもしれません。

>無償ながら強力なログ解析ツール
>Log Parserを活用する
>http://www.atmarkit.co.jp/fwin2k/operation/logparser1/logparser1_01.html

Log Parserは一度韓国語XPでも動かしてみました。活用するまでには
もっといじくりまわして、動作をよく理解しないといけません。

>Windows PowerShell
>http://d.hatena.ne.jp/kasaisyuji/20061101/1162384389
>
>OpenOffice
>http://www.forest.impress.co.jp/lib/offc/document/offcsuite/openoffice.html
>
>( NET のコンパイル言語も Express版は無償です、場違い?)

結局他のプログラムの活用となると、今度はOS対応の問題、文字コード
の問題も出てきますので、その辺も含めて見極めていかなければ
なりません。

本格的で膨大なコーパスを使った言語研究となると、テキストでの
データ処理では限界があるということですね。参考にいたします。

[ ]
RE:22100 変換モジュールのブロック範囲ソNo.22108
白雲斎 さん 06/11/02 15:08
 
こんにちは マボカル さん、白雲斎です。

末尾のマクロはどうでしょう。
ただし、Shift_JIS以外(標準入出力の対応外)の文字は化けて返って来ますが。
尚、日本語OS以外で正常動作するかは、よく分かりません。

変化モジュールにも実装されると良いですね。


// 比較開始の桁位置を指定してDOSソート
// 比較開始位置から開始したBOX範囲選択をして実行すること
if( !rectselecting ) endmacro;
#ty = ytolineno(seltopx, seltopy);
#ey = ytolineno(selendx, selendy);
escape;
moveto seltopx, seltopy;
#n = 0;
while( column )
{
    left;
    #n = #n + 1;
}
movetolineno 1, #ty;
beginsel;
if( linecount2 == #ey ) gofileend;
else movetolineno 1, #ey + 1;
run "sort /+" + str(#n) + " <con >con";
endmacro;

[ ]
RE:22105 変換モジュールのブロック範囲ソNo.22109
秀丸担当 さん 06/11/02 15:19
 

>一応変換モジュールですので、秀丸エディタの基本機能として追加
>されるものでもありませんので、技術的に問題がなければ、比較的
>柔軟に機能追加が出来るのではという考えで投稿しました。
>
>私が変換モジュールを作ることが出来れば一番いいのですが、それは
>未知の領域です。マクロ文を書いたり、既存のマクロを作業内容に
>あわせて書き換えたりといったレベルですね。
>
>こういった機能の需要はあまりないのでしょうかね?
>とにかくご意見ありがとうございました。

変換モジュールとして、表計算のようなソートもできたら便利だと思います。
需要というか、タブ文字の幅を自由に調節して表計算っぽくしたいというネタも
あります。
現状でやるとしたら、マクロでもできるかもしれません。
一時的に行頭にもってきてソートし、また元に戻すという一連の動作をマクロに
すればできるかもしれないです。
ただ必ず揃っていなくてはいけなかったり、タブ文字が含まれていたらどうなる
のかとか考えるとややこしいかもしれません。

[ ]
RE:22108 変換モジュールのブロック範囲ソNo.22111
マボカル さん 06/11/02 15:31
 
白雲斎さん

ありがとうございます。

>末尾のマクロはどうでしょう。
>ただし、Shift_JIS以外(標準入出力の対応外)の文字は化けて返って来ますが。
>尚、日本語OS以外で正常動作するかは、よく分かりません。

そういえばDOSソートの段階で文字化けしてしまいますね。私の環境が
韓国語XPですので、ローカルコードである韓国語の文字コードにしか
対応しないといった問題があります。

変換モジュールはユニコード対応になりましたのでOKですが、問題は
マクロから変換モジュールの呼び出しですが、それって可能なんで
しょうか?それが無理だと結局マクロでもダメですね。ダメというか
汎用性の面で問題が残りますね。

>// 比較開始の桁位置を指定してDOSソート
>// 比較開始位置から開始したBOX範囲選択をして実行すること
>if( !rectselecting ) endmacro;
>#ty = ytolineno(seltopx, seltopy);
>#ey = ytolineno(selendx, selendy);
>escape;
>moveto seltopx, seltopy;
>#n = 0;
>while( column )
>{
>    left;
>    #n = #n + 1;
>}
>movetolineno 1, #ty;
>beginsel;
>if( linecount2 == #ey ) gofileend;
>else movetolineno 1, #ey + 1;
>run "sort /+" + str(#n) + " <con >con";
>endmacro;

<実行結果>
OSの関係上(韓国版XP)、日本語は見事に文字化けしてしまいました。
韓国語はOKでしたが・・。ありがとうございました。

[ ]
RE:22109 変換モジュールのブロック範囲ソNo.22112
マボカル さん 06/11/02 15:38
 
秀丸担当さん

ありがとうございます。

>変換モジュールとして、表計算のようなソートもできたら便利だと思います。
>需要というか、タブ文字の幅を自由に調節して表計算っぽくしたいというネタも
>あります。
>現状でやるとしたら、マクロでもできるかもしれません。
>一時的に行頭にもってきてソートし、また元に戻すという一連の動作をマクロに
>すればできるかもしれないです。
>ただ必ず揃っていなくてはいけなかったり、タブ文字が含まれていたらどうなる
>のかとか考えるとややこしいかもしれません。

この問題に関連して、白雲斎さんからのコメントで気づきましたが、
私のような日本語OSでない環境で、しかも多言語処理となると、現状
でマクロを組むとしても問題が出ることがわかりました。

現在あるものを利用すするという解決法の一つとして、今の変換
モジュールをマクロから呼び出すことが出来ればベストですが、
それって可能でしょうか?またマクロから任意の変換モジュールを
呼び出す文を追加するというネタはどうでしょうか?


[ ]
RE:22111 変換モジュールのブロック範囲ソNo.22113
秀丸担当 さん 06/11/02 15:42
 

>変換モジュールはユニコード対応になりましたのでOKですが、問題は
>マクロから変換モジュールの呼び出しですが、それって可能なんで
>しょうか?それが無理だと結局マクロでもダメですね。ダメというか
>汎用性の面で問題が残りますね。

白雲斎さんのコメントを見ずにコメント先がばらばらになってしまいすみません。
マクロから変換モジュールを呼び出すことはできます。

run "sort /+" + str(#n) + " <con >con";

の代わりに、

filter "C:\\folder\\Sort.hmf" , "Sort" , "00001";

という感じでいけるのではないかと思います。
最後の"00001"の部分はソートのときのダイアログの設定内容です。
設定内容とこの文字列の対応は、キー操作の記録をして、変換モジュールを動か
し、キー操作の保存をすることで知ることができます。

ただ、白雲斎さんの示されたマクロでは、BOX選択のカラム(?)が行頭に移動して
いないので期待通りの動作にはなっていないような気もします。

[ ]
RE:22112 変換モジュールのブロック範囲ソNo.22114
マボカル さん 06/11/02 15:47
 
秀丸担当さん

>現在あるものを利用すするという解決法の一つとして、今の変換
>モジュールをマクロから呼び出すことが出来ればベストですが、
>それって可能でしょうか?またマクロから任意の変換モジュールを
>呼び出す文を追加するというネタはどうでしょうか?

と書いてしまいましたが、ヘルプで確認したところ、変換モジュールの
呼び出し文ってこれのことでしょうか?

filter 変換モジュール名, 関数名, パラメタ

ということは

filter sort,

と表記して、残りの関数名、パラメタの部分はどう表記すれば
いいのでしょうか。参考になるマクロが手元にありませんので
ご教示お願いします。

/////////////////////////////////////////////////////////////

filter文
 filter文は、パラメタを指定して、変換モジュールを呼び出します。(V5.00以降)

filter 変換モジュール名, 関数名, パラメタ

 変換モジュール名に "" (何も無い文字列)を指定すると、標準の変換モジュール
(HmFilter.hmf)を使用します。
 パラメタは、変換モジュールに渡す文字列のパラメタです。パラメタの内容は、変
換モジュールが自由に決めることができます。パラメタは省略可能です。
 変換モジュールのパラメータを調べるには、「キー操作の記録開始/終了」と
「キー操作の保存...」を使う方法があります。

 V5.00より、変換系のコマンドをキー操作の記録すると、indentやtohankakuなどで
は記録されず、filterで記録されるようになりました。

 filterやindentやtohankakuなどの変換の文は、範囲選択した状態で実行しなけれ
ば意味がありません。

[ ]
RE:22114 変換モジュールのブロック範囲ソNo.22115
マボカル さん 06/11/02 15:51
 
秀丸担当さん

こちらでご回答なさっていましたね。
http://www.maruo.co.jp/hidesoft/2/x22100_.html?a=4#22113

了解しました。これで解決できます。ありがとうございました。

[ ]
RE:22112 変換モジュールのブロック範囲ソNo.22116
Iranoan さん 06/11/02 15:51
 
 マボカルさん今日は、Iranoan です。
> モジュールをマクロから呼び出すことが出来ればベストです
 filter 文を使えばよろしいかと。

[ ]
RE:22113 変換モジュールのブロック範囲ソNo.22117
マボカル さん 06/11/02 15:55
 
秀丸担当さん

>白雲斎さんのコメントを見ずにコメント先がばらばらになってしまいすみません。
>マクロから変換モジュールを呼び出すことはできます。
>
>run "sort /+" + str(#n) + " <con >con";
>
>の代わりに、
>
>filter "C:\\folder\\Sort.hmf" , "Sort" , "00001";
>
>という感じでいけるのではないかと思います。
>最後の"00001"の部分はソートのときのダイアログの設定内容です。
>設定内容とこの文字列の対応は、キー操作の記録をして、変換モジュールを動か
>し、キー操作の保存をすることで知ることができます。

なるほど。変換モジュールの保存位置の経路を表記するのですね。
これを参考にマクロを組んでみます。ありがとうございました。


[ ]
RE:22113 変換モジュールのブロック範囲ソNo.22121
白雲斎 さん 06/11/02 16:56
 
こんにちは 秀丸担当 さん、白雲斎です。

マボカルさんの最初の発言で

>一つ要望ですが、ブロック指定した文字列を基準にソート出来るように
>機能を追加することはできるでしょうか?そうするともっと活用範囲が
>広がると思うのですが。
>
>勿論ブロック範囲のソートといっても、ブロック範囲の文字列を基準と
>するだけで、各行の文字列の内容が変わってしまう動きを言っている
>わけではありません。例えば以下のようなデータがあるとして、
>
>番号1 わじま 32歳 男
>番号2 すずき 29歳 女
>番号3 たなか 57歳 男
>番号4 かとう 45歳 男
>番号5 あらき 38歳 女

とありましたので、年齢部分をBOX選択した場合は年齢を表す文字からソート比
較をすれば良いと考えました。
DOSのSORTでは、比較を開始する桁位置を指定できるので、実際のソートでは行
選択に切り替えて、桁位置オプションを渡しています。

>ただ、白雲斎さんの示されたマクロでは、BOX選択のカラム(?)が行頭に移動して
>いないので期待通りの動作にはなっていないような気もします。

今となっては私が示したマクロは意味がなくなりましたが、この発言の意味が理
解できません。
よろしかったら、変なところを指摘してもらえないでしょうか。

[ ]
RE:22106 変換モジュールのブロック範囲ソNo.22122
ENCODINGSHIFTJIS さん 06/11/02 17:16
 
本格的データ処理では、DBソフトは もう 必修です。
独自形式のデータ形式を使っていたシステムも 内部で DBを使うように
の、傾向です、そのほうが保守が楽。

サーバーを立てて動かすDBではなく、スタンド・アローンのDBソフトも
フリーであります(OpenOfficeの Base など)
===============

movetolineno 17,lineno; // 列の頭に持ってくる
beginsel;
movetolineno 17+4,lineno; // カーソル移動で範囲選択
copy;
golinetop2;    // 行頭移動
paste; insert "#"; // わかりやすさの区切り
down; // 次行に下げる

上記の秀丸マクロは1行分。
今回のテキスト例では BOX選択 を使わない形もできます。
項目区切りが明確なら、正規表現の全置換が使えるのでは。

[ ]
RE:22121 変換モジュールのブロック範囲ソNo.22123
秀丸担当 さん 06/11/02 17:19
 

>今となっては私が示したマクロは意味がなくなりましたが、この発言の意味が理
>解できません。
>よろしかったら、変なところを指摘してもらえないでしょうか。

sort.exeでは桁位置を指定できるのですね。失礼しました。
sort.exeを使う場合はちゃんと動いていました。
filter文に置き換えると、期待通りにならなかったので勘違いしました。

[ ]
RE:22121 変換モジュールのブロック範囲ソNo.22124
白雲斎 さん 06/11/02 17:21
 
白雲斎です。

投稿後に、更に実験しました。
DOSのSORTの桁位置オプションは、文字数のようです(分かっていたのに)。
ですので、

番号1 わじま 32歳 男
番号2 AAAAAA 29歳 女
番号3 たなか 57歳 男
番号4 BBBBBB 45歳 男
番号5 あらき 38歳 女

のように、指定桁までの文字数が違うと、望む結果を得られません。
秀丸担当さんが仰っていたのは、このことかな!

※先のマクロを利用しようと思った方は、注意してくださいね。

[ ]
RE:22122 変換モジュールのブロック範囲ソNo.22125
マボカル さん 06/11/02 18:39
 
ENCODINGSHIFTJISさん

ありがとうございます。

>本格的データ処理では、DBソフトは もう 必修です。
>独自形式のデータ形式を使っていたシステムも 内部で DBを使うように
>の、傾向です、そのほうが保守が楽。
>
>サーバーを立てて動かすDBではなく、スタンド・アローンのDBソフトも
>フリーであります(OpenOfficeの Base など)

OpenOfficeは見たところ、マイクロソフトのオフィスと似たような
ソフトですが、データ処理はエクセルとかアクセスで行っても
OpenOfficeとはさほど変わらないということでしょうか。オフィスは
使い慣れているので、私にとってはそのほうが便利です。

>===============
>
>movetolineno 17,lineno; // 列の頭に持ってくる
>beginsel;
>movetolineno 17+4,lineno; // カーソル移動で範囲選択
>copy;
>golinetop2;    // 行頭移動
>paste; insert "#"; // わかりやすさの区切り
>down; // 次行に下げる
>
>上記の秀丸マクロは1行分。

これはこのような一連の作業がOpenOfficeでは一行で表記できる
ということでしょうか?つまり処理が早いということですか?

私が主にテキストエディタを使う理由は何かと考えてみたところ、
データ処理というより、データ構築(編集)という作業が主なので、
どうしてもエディタを好んで使っているのではと思いました。

DBソフトはエクセルを利用する程度ですので、本格的なデータ処理
というレベルではないのかもしれませんね。私の思うに、本格的な
データ処理・管理となると、やっぱりそれなりのDBソフトを使う
やり方がいいのでしょうが、逆に考えて、私のように主にデータ
構築・編集という作業環境では、どのようなソフトが適切でしょうか?

例えば今回の投稿の例に挙げたようなデータもデータは分かりやすい
ように適当に書いたものですが、実際の作業ではデータを抽出するだけ
でなく、抽出したデータの中から誤った記述を編集したりする作業を
やっているわけでして、ソートをする理由も、そのような誤記述の
部分を視覚的に分かりやすくするためでした。

エクセルやアクセスなどは便利すぎるというか機能が多すぎて、作業中
誤って変な作業をしてしまわないかと心配になることもあります。
実際に昔使い慣れてない頃は、大失敗してデータをめちゃくちゃに
編集してしまったこともありました。勝手に計算してしまったり、
勝手に削除されたりと・・。

それに比べてエディタで編集してると、ありのままのテキストを
扱っているという感じで、安心して作業が出来ますが、そう思っている
のは私だけでしょうか?

とにかく大量のデータを扱うには、それなりのDBソフトが必要なので、
しっかり勉強します。エクセルでは行の制限があるので、アクセスとか
その他のソフトの勉強ですね。

[ ]
RE:22125 変換モジュールのブロック範囲ソNo.22126
Iranoan さん 06/11/02 19:24
 
 マボカルさん今日は、Iranoan です。
 横から失礼します。
> 私の思うに、本格的な
> データ処理・管理となると、やっぱりそれなりのDBソフトを使う
> やり方がいいのでしょうが、逆に考えて、私のように主にデータ
> 構築・編集という作業環境では、どのようなソフトが適切でしょうか?
 「どちらが良い」とは一概には言えないと思います。単純な編集ならエディ
タの方が便利ですが、ソートなどデータの処理が少しでも絡んでくると、表計
算の方が早くしかも簡単にできます。どちらか一方ばかりを使うのではなく、
データは基本的にテキスト・データで保存しておき、適宜表計算に貼り付けて
処理をすれば良いと思います。
 この時のポイントは、セルの区切りにはタブを使うことです。そうすると、
コピー&ペーストでデータ渡すことも、エディタと表計算のどちらで開くこと
も出来ます。

 ただこの場合数値に関しては注意が必要です。数値が丸められることが有る
ので、表計算で保存する時とコピー&ペーストでエディタにデータを移すとき
に、予め表示桁数を増やしておく必要があります。

[ ]
RE:22125 変換モジュールのブロック範囲ソNo.22127
アルビレオ さん 06/11/02 20:02
 
ユーザーのアルビレオです。

>とにかく大量のデータを扱うには、それなりのDBソフトが必要なので、
>しっかり勉強します。エクセルでは行の制限があるので、アクセスとか
>その他のソフトの勉強ですね。

ソートはエクセルのような表計算ソフトでは必須の機能の一つですが、秀丸エデ
ィタにとっては「こういうこともできる」という応用のひとつに過ぎず、性能は
比べ物にならないくらい違います。
エクセルの行数制限を気にしなければいけないようなデータ量を秀丸エディタで
ソートさせるというのは、遅すぎて使い物にならない可能性があります。
もともと大量データのソートというのは、かなり時間がかかるために古くから研
究対象になっていたくらいやっかいなものですから。

[ ]
RE:22126 変換モジュールのブロック範囲ソNo.22128
マボカル さん 06/11/02 20:56
 
Iranoanさん

ありがとうございます。

> 「どちらが良い」とは一概には言えないと思います。単純な編集ならエディ
>タの方が便利ですが、ソートなどデータの処理が少しでも絡んでくると、表計
>算の方が早くしかも簡単にできます。どちらか一方ばかりを使うのではなく、
>データは基本的にテキスト・データで保存しておき、適宜表計算に貼り付けて
>処理をすれば良いと思います。

やっぱりベストは適宜ソフトを使い分けるですかね。私のような面倒
くさがり屋は何でも一つで済ませられないかと考えてしまうものです。

> この時のポイントは、セルの区切りにはタブを使うことです。そうすると、
>コピー&ペーストでデータ渡すことも、エディタと表計算のどちらで開くこと
>も出来ます。

エクセルでも扱うようなデータに関してはその辺も考えて保存して
います。

[ ]
RE:22127 変換モジュールのブロック範囲ソNo.22129
マボカル さん 06/11/02 21:02
 
アルビレオさん

ありがとうございます。

>エクセルの行数制限を気にしなければいけないようなデータ量を秀丸エディタで
>ソートさせるというのは、遅すぎて使い物にならない可能性があります。
>もともと大量データのソートというのは、かなり時間がかかるために古くから研
>究対象になっていたくらいやっかいなものですから。

確かにエクセルの行数制限以上のデータをエディタで開くだけでも
すごいことになるでしょうね。大きな辞書のファイルとかは秀丸
エディタで開くのにも直ぐに最後の列まで完全に見ることが出来ません
でした。

データも色々ありまして、文章を入力しただけのプレインテキストから
タグ付けしたもの、また辞書の見出し語の一覧のような行数の長い
ものまであります。作業内容に応じて適宜対応していかなければ
なりませんね。

[ ]
RE:22100 変換モジュールのブロック範囲ソNo.22130
dszhm さん 06/11/02 22:55
 
>こんにちは。マボカルです。いつも変換モジュールのソートを使わせて
>頂いております。
>
>http://hide.maruo.co.jp/lib/hmconv/sort102.html
>
>一つ要望ですが、ブロック指定した文字列を基準にソート出来るように
>機能を追加することはできるでしょうか?そうするともっと活用範囲が
>広がると思うのですが。
>
>勿論ブロック範囲のソートといっても、ブロック範囲の文字列を基準と
>するだけで、各行の文字列の内容が変わってしまう動きを言っている
>わけではありません。例えば以下のようなデータがあるとして、
>
>番号1 わじま 32歳 男
>番号2 すずき 29歳 女
>番号3 たなか 57歳 男
>番号4 かとう 45歳 男
>番号5 あらき 38歳 女
>
>年齢を基準にソートさせたい場合は、年齢の範囲だけブロック指定して
>ソートを行い、
>
>番号2 すずき 29歳 女
>番号1 わじま 32歳 男
>番号5 あらき 38歳 女
>番号4 かとう 45歳 男
>番号3 たなか 57歳 男
>
>のような結果で表示させ、名前を基準にソートさせたい場合は名前の
>範囲だけブロック指定してソートを行い、
>
>番号5 あらき 38歳 女
>番号4 かとう 45歳 男
>番号2 すずき 29歳 女
>番号3 たなか 57歳 男
>番号1 わじま 32歳 男
>
>のように表示する方法です。そのなことエクセルを使えばいいじゃ
>ないかという話かもしれませんが、エディタでの一貫した作業が何かと
>都合が良いので要望を出しました。技術的に可能でしたら、機能追加の
>ほうご検討よろしくお願いします。
 実は、私、
 秀丸エディタでの矩形選択したカラム範囲を第一キーとして
 レコードをソートする手段を持ってはいますが、
 関連マクロは提供できるとしても、
 JPerl5.001を前提とし、初期設定ファイルなどは
 環境に合わせて調整することになります。
 基本概念は、
 (1)マクロで秀丸エディタから対象データのタブ幅と
   矩形選択の範囲を引数を経由してスクリプトに渡す。
  (2)スクリプトでは範囲行の中の各行を入力し、
   タブを空白に変換し、
   範囲桁の部分をキーとしてレコードを値として蓄積する
   (値とするレコードは変換前レコードです)
   全ての範囲行の入力が完了したらキー順にレコードを
   出力する
 というところです。

[ ]
RE:22124 変換モジュールのブロック範囲ソNo.22131
dszhm さん 06/11/02 22:58
 
>番号1 わじま 32歳 男
>番号2 AAAAAA 29歳 女
>番号3 たなか 57歳 男
>番号4 BBBBBB 45歳 男
>番号5 あらき 38歳 女
>
>のように、指定桁までの文字数が違うと、望む結果を得られません。
>秀丸担当さんが仰っていたのは、このことかな!
 GNU 系のUNIX的なsortなら多少カラムやフィールドの文字数が
 一定ではなくてもできるかも知れませんが
 コマンドへ渡す引数の算出が難しいかもしれません。

[ ]
RE:22130 変換モジュールのブロック範囲ソNo.22132
マボカル さん 06/11/02 23:42
 
dszhmさん

ありがとうございます。

> 実は、私、
> 秀丸エディタでの矩形選択したカラム範囲を第一キーとして
> レコードをソートする手段を持ってはいますが、
> 関連マクロは提供できるとしても、
> JPerl5.001を前提とし、初期設定ファイルなどは
> 環境に合わせて調整することになります。
> 基本概念は、
> (1)マクロで秀丸エディタから対象データのタブ幅と
>   矩形選択の範囲を引数を経由してスクリプトに渡す。
>  (2)スクリプトでは範囲行の中の各行を入力し、
>   タブを空白に変換し、
>   範囲桁の部分をキーとしてレコードを値として蓄積する
>   (値とするレコードは変換前レコードです)
>   全ての範囲行の入力が完了したらキー順にレコードを
>   出力する
> というところです。

これは結局Perlに渡して作業を行うマクロということでしょうか?
PerlはUnicode対応になったとはいえ、プログラム間のやり取りで
上手くいくか分かりません。なんだか簡単そうに見えてブロック範囲を
基準としたソートという作業は結構ややこしいものなのでしょうか?

dszhmさんのマクロを頂いても、使いこなせるか自信がありませんね。
dszhmさんのおっしゃる基本概念部分がよく理解できていないので
そうかもしれません。

ところで皆さんからの色んなご指摘を参考にして、自分でマクロを
組んでみていますが、基本的な考えはIranoanさんや
ENCODINGSHIFTJISさんのご提案の

0.(マクロ実行前に)対象文字列をブロック範囲指定
1.ブロック範囲部分をコピー&行頭にペースト
2.ソート
3.行頭のソートキーを削除

のような手順ですが、2までは出来ても、3の作業で止まってしまい
ました。はて?1でブロック範囲でコピーした文字列をどうやって
マクロ内で検索して削除すればいいのかと。ここからここまでが
ソートのために一時的にに貼り付けたブロック範囲部分ですよという
ことをどうやってマクロ側に認識させることができるのでしょうか?


[ ]
RE:22132 変換モジュールのブロック範囲ソNo.22134
山紫水明 さん 06/11/03 08:46
 
 マボカルさん,

>ソートのために一時的にに貼り付けたブロック範囲部分ですよという
>ことをどうやってマクロ側に認識させることができるのでしょうか?

任意の記号を最初に行頭に埋め込んでおくというのはどうでしょう。
Sort.hmf が秀丸エディタのフォルダにあるとして,次のような感じです。

//--------------------------------------------------//
if( !rectselecting ) endmacro;
copy;
disabledraw;
replaceallfast "^","@", regular;
gofiletop;
pasterect;
selectall;
filter hidemarudir + "\\Sort.hmf" , "Sort", "0001";
escape;
replaceallfast "^.+@","", regular;
endmacro;
//--------------------------------------------------//

     では, (^^)/~
                                        山紫水明
                                        SANSHISUIMEI

[ ]
RE:22134 変換モジュールのブロック範囲ソNo.22135
マボカル さん 06/11/03 20:36
 
山紫水明さん

ありがとうございます。今日は一日中外出していたものですから、
お返事が遅れました。山紫水明さんのマクロを早速試してみましたが、
これだと一時的に貼り付けた@が残ってしまうようですが。また
selectallで常に全体に対してソートが行われるような設計のようで、
この点も求める結果にはなりませんでした。

で、今日外出先でも色々考えていた案があって、それをマクロで組んで
みたところ上手くいったような感じです。

//--------------------------------------------------//
disableinvert;
disabledraw;
if( !rectselecting ) endmacro;
setcompatiblemode 15;
#y = seltoplineno;
#startx = seltopx;
#starty = seltopy;
copy2;
moveto #startx, #starty;
escape;
golinetop2;
paste;
beginrect;
golastupdated;
#startx = seltopx;
#starty = seltopy;
#endx = selendx;
#endy = selendy;
filter "C:\\Program Files\\Maruo\\Sort.hmf" , "Sort" , "00001";
moveto #startx, #starty;
beginrect;
moveto #endx, #endy;
delete;
endmacro;
//--------------------------------------------------//

私の使っているプログラムが日本語版の秀丸エディタではなく、
英語版の秀丸エディタですので

filter "C:\\Program Files\\Maruo\\Sort.hmf" , "Sort" , "00001";

の部分は適宜書き換える必要があるでしょうが、一応今のところこれ
だと文中の指定した範囲のみのソートが行われています。まだ無駄な
書き方が多くて、お見せするのも恥ずかしいマクロですが、結果を
報告いたします。

山紫水明さんのマクロの@が残るという部分に関しては、私の動かし方
がまずかったのでしょうか?

とにかくありがとうございました。

[ ]
RE:22135 変換モジュールのブロック範囲ソNo.22136
山紫水明 さん 06/11/04 08:21
 
 マボカルさん,

>これだと一時的に貼り付けた@が残ってしまうようですが。

 不思議ですね。
 replaceallfast "^.+@","", regular;
で,行頭から @ まで削除されるはずですが。OSや文字コードの関係があるの
でしょうか。よくわかりません。
 ただ,任意の文字を埋め込む方法は,テキストの中にその文字がある場合には
注意が必要ですね。

>selectallで常に全体に対してソートが行われるような設計のようで、この点も
>求める結果にはなりませんでした。

 これはとりあえずの処理の仕方の例としてお示ししただけのものでしたので,
範囲選択のことを考慮すれば,お示しになったような処理が必要だと思います。

     では, (^^)/~
                                        山紫水明
                                        SANSHISUIMEI

[ ]
RE:22136 変換モジュールのブロック範囲ソNo.22137
マボカル さん 06/11/04 12:24
 
山紫水明さん

> 不思議ですね。
> replaceallfast "^.+@","", regular;
>で,行頭から @ まで削除されるはずですが。OSや文字コードの関係があるの
>でしょうか。よくわかりません。

なぜそういう結果になるのかわかりました。私は行中の任意の文字列
を基準に、しかも任意の行数に対してソートを行うことのできる機能
まで考えていたものですから、山紫水明さんのマクロをチェックする
ときもそういう使い方をしていました。たとえば以下のデータに対して

番号1 わじま 32歳 男
番号2 すずき 29歳 女
番号3 たなか 57歳 男
番号4 かとう 45歳 男
番号5 あらき 38歳 女

名前を基準にソートを行いたく、しかも番号1〜番号3までの3人に
対してのみソートを行おうとしたとき、ブロック範囲指定も「わじま
〜たなか」の範囲までにしてマクロを実行すると以下のように

@番号4 かとう 45歳 男
@番号5 あらき 38歳 女
番号2 すずき 29歳 女
番号3 たなか 57歳 男
番号1 わじま 32歳 男

@が残ってしまう+ソートの結果が求める結果にはならないといった
ことを確認しましたので、そういうことをご報告しました。マクロ
自体が全体を対象に行われることを前提に作られてあるので、ブロック
範囲の指定を名前全体に、つまり「かとう〜わじま」までにすると
正しい結果が得られますね。特にOSの関係や文字コードが影響する
といったことは無いようです。へんなご心配をおかけしました。
私のマクロの動かし方に問題があったようです。

> ただ,任意の文字を埋め込む方法は,テキストの中にその文字がある場合には
>注意が必要ですね。

そうですね。可能性は少ないといっても行数があまりにも多いと
見逃してしまうこともありそうでちょっと危険でもありますね。

> これはとりあえずの処理の仕方の例としてお示ししただけのものでしたので,
>範囲選択のことを考慮すれば,お示しになったような処理が必要だと思います。

いろんな解決法があることを知ることも大変勉強になります。
ありがとうございました。



[ ]