行内の並び替えNo.25646
cent さん 08/11/19 04:09
 
いつも大変お世話になります。

行内の並び替えを行いたいと考えています。

a&bc&b&ba&aa
b&d&a&bc&ba

これを並び替え処理を行うと

a&aa&b&ba&bc
a&b&ba&bc&d

となるように処理を加えたいと思っています。

並び替え順序はアルファベット順です。
区切り文字は&になります。
データは複数行あります。

お忙しいところ申し訳ございませんが
ご指導をなにとぞよろしくお願いいたします。

cent


[ ]
RE:25646 行内の並び替えNo.25647
秀丸担当 さん 08/11/19 10:08
 

並び替えは、[その他]→[プログラム実行]で、「sort <con >con」とすることで
できます。
あるいは、変換モジュールライブラリ
http://hide.maruo.co.jp/lib/hmconv/index.html
にあるソートを使うとできます。
いずれも行ごとのソートです。

一行ずつ、&を改行に置換して、ソートして、改行を&に戻す、という作業をすれ
ばできると思います。
改行への置換は、置換ダイアログで正規表現をONにして「\n」と書くと改行に置
換できます。

一行ずつ範囲を絞るには、置換では「選択した範囲のみ」オプションがあります
が、改行の扱いやソートが難しいので、一行選択して[表示]→[部分編集]すると
いいと思います。

これらの一連の作業をマクロ化すると、全て自動的にすることもできると思いま
す。

[ ]
RE:25646 行内の並び替えNo.25649
ENCODINGSHIFTJIS さん 08/11/19 12:21
 

// テキスト処理の魂(懐古趣味) デジタルネイティブは スクリプトを書け

// 補助線を引くように、処理に必要な区切り記号を使うのがミソ

gofiletop; //頭出し
LOOP1:     // 固定長行番号
replacedown "^",rightstr("0000"+str(lineno),5)+"&",regular ;
if(result) goto LOOP1;

replaceallfast "^(.+)&(.+)&(.+)&(.+)&(.+)&(.+)$","\\1&\\2\n\\1&\\3\n\\1&\\4\
n\\1&\\5\n\\1&\\6\n\\1&●",regular;

gofiletop; //頭出し
selectall; // allfast は結果ダイアログ表示ででフォーカスが戻る?
run "sort <con >con";
//endmacro;
replaceallfast "[0-9]{5}&","",regular; // allfast は結果ダイアログ表示ででフ
ォーカスが戻る?

replaceallfast "([^●])\n","\\1&",regular; // 元の行を再生
replaceallfast "&●|●|&$","",regular;     // 後始末の 出たトコ勝負の雰囲気
endmacro;

searchdown "^",regular ;
insert "{"+str(lineno)+"}";

endmacro;


[ ]
RE:25647 行内の並び替えNo.25650
cent さん 08/11/19 12:31
 
ありがとうございます。

>並び替えは、[その他]→[プログラム実行]で、「sort <con >con」とすることでで
>きます。

1行sortすることはできました。

>あるいは、変換モジュールライブラリ
>(http://hide.maruo.co.jp/lib/hmconv/index.html
>にあるソートを使うとできます。

Sort.hmfの動かし方がわかりませんでした。
HMFファイルはどのようにして動かすのでしょうか。

また、
ソート(Sort.hmf)という変換モジュールをマクロ化する例
 1.適当に範囲選択する
 2.[マクロ]→[キー操作の記録開始/終了](標準でShift+F1)
 3.[編集]→[変換]→[ソート]
 4.[マクロ]→[キー操作の記録開始/終了](標準でShift+F1)
 5.[マクロ]→[キー操作の保存]
 6.適当に test.mac などというファイル名で保存
を確認しましたが理解できませんでした。

>これらの一連の作業をマクロ化すると、全て自動的にすることもできると思いま
>す。

複数行の一括sortの実現方法をお教え願います。
よろしくお願いいたします。



[ ]
RE:25649 行内の並び替えNo.25651
cent さん 08/11/19 13:38
 
ENCODINGSHIFTJIS 様

大変詳細で貴重なご指導ありがとうございます。

a&bc&b&ba&aa
b&d&a&bc&ba

a&a&aa&b&b&ba&ba&bc&bc&d
になりましたが
何を追加すればよろしいでしょうか?

よろしくお願いいたします。



>// テキスト処理の魂(懐古趣味) デジタルネイティブは スクリプトを書け
>
>// 補助線を引くように、処理に必要な区切り記号を使うのがミソ
>
>gofiletop; //頭出し
>LOOP1:     // 固定長行番号
>replacedown "^",rightstr("0000"+str(lineno),5)+"&",regular ;
>if(result) goto LOOP1;
>
>replaceallfast "^(.+)&(.+)&(.+)&(.+)&(.+)&(.+)$","\\1&\\2\n\\1&\\3\n\\1&\\4
>\n\\1&\\5\n\\1&\\6\n\\1&●",regular;
>
>gofiletop; //頭出し
>selectall; // allfast は結果ダイアログ表示ででフォーカスが戻る?
>run "sort <con >con";
>//endmacro;
>replaceallfast "[0-9]{5}&","",regular; // allfast は結果ダイアログ表示でで
>フォーカスが戻る?
>
>replaceallfast "([^●])\n","\\1&",regular; // 元の行を再生
>replaceallfast "&●|●|&$","",regular;     // 後始末の 出たトコ勝負の雰囲気
>endmacro;
>
>searchdown "^",regular ;
>insert "{"+str(lineno)+"}";
>
>endmacro;
>

[ ]
RE:25651 行内の並び替えNo.25652
ENCODINGSHIFTJIS さん 08/11/19 14:20
 
LOOP1:     // 固定長行番号
searchdown2 "^",regular ;
if(!result) goto LOOPEXIT1;
insert rightstr("0000"+str(lineno),5)+"&";
goto LOOP1;
LOOPEXIT1:

で 通ると思います。
行番号のところで タイミングずれますね、1が二回出るため。

// replacedownの linenoは検索ヒットした行ではなく、検索スタートの行番号にな
る ため。
// replacedown "^",rightstr("0000"+str(lineno),5)+"&",regular ;

大規模や汎用を求めるなら、チャント プログラミングすべき。
Googleのように 中核からガッチリなら C++
Yahooのように フワフワでいいなら スクリプト。

[ ]
RE:25650 行内の並び替えNo.25654
秀丸担当 さん 08/11/19 16:22
 

マクロはENCODINGSHIFTJISさんの方法で解決されたかもしれませんが、念のため
変換モジュールについてコメントしておきます。

>Sort.hmfの動かし方がわかりませんでした。
>HMFファイルはどのようにして動かすのでしょうか。

[その他]→[動作環境]で、左下の「上級者向け設定」をONにし、[その他]→[動
作環境]→[編集]→[変換]より、hmfファイルを登録します。
sort <con >con で機能に不足が無いのであれば、あえてこれを使う必要は無い
かもしれません。

[ ]
RE:25652 行内の並び替えNo.25656
cent さん 08/11/20 05:24
 
ENCODINGSHIFTJIS 様

パーフェクトでした。
ありがとうございました。

[ ]