カッコの中の文字を抜き出し別名保存No.05085
W.Hiroshi さん 06/03/06 10:59
 
こんにちは、W.hiroshiです。

秀丸のマクロで処理できないかと考えているのですが、自分の能力には荷が重すぎて、
マクロを使うと出来るんじゃないかなと何となく思うだけで、具体的なマクロ文の記
述がさっぱり思い浮かびません。
具体的なマクロ文の記述例などを教えていただけると有り難いのですが。


NC工作機械の加工用プログラムです。
本文の中に、

N10(..T15-12.0-RF-ED..)

N130(..T12-M5-TP..)

の様に、()カッコでくくられたコメント文に、
そのときの加工で使われる工具の番号や工具の名前などが書かれています。

このカッコの中の文字列を抜き出して別名のファイルに書き出し、使用工具の一覧の
様なものを作りたいと思っています。

具体的には、

1.ファイルの先頭から順に、( )カッコで囲まれた文字列を抜き出し、1行ずつ
並べて書きだし、新規のファイルに保存する。
  保存場所は現在のファイルと同じホルダーとする。
  ファイル名は、現在のファイル名の末尾に、
  [TL]と言う文字を追加

  元のファイル名が ***.DAT だったら=> ***[TL].DAT
  の様にする。

2.同じ工具が複数回使われていることもあるので、
  抜き出した文字列を一行ずつ比較して、全く同じ文字列の行は
  削除する。
 (たとえ1文字でも違う文字が含まれる時は違うものとして扱う。)

3.Tに続く二桁の数字は工具の番号を表すのでそのまま残し
  その後の「-」に囲まれた「.」(小数点)を含む数字は、
  その工具の径を表しているので、一覧表示した時小数点の
  位置がそろう様に「-」から「.」の間の文字数が同じくなる様、
  空白を挿入したい。

例えば
     T01-123.0-CT   =>  T01-123.0-CT
     T02-12.0-ED    =>  T02- 12.0-ED
     T03-1.0-DR    =>  T03-  1.0-DR

という様な感じで、(「-」から「.」までの数字は3桁以下)

Tに続く二桁の数字に続く「-」の次が数字以外の時は何もしない。
     T04-C-ED     =>  T04-C-ED

4.Tに続く番号で、番号順に並べ替えたい(小さい順)
  T番号は数字2桁、順不同で、途中抜けている番号もある

なお、本文中に書かれている文字は、英数字と一部記号、すべて半角です。
以上


出来れば一つのマクロで一度に全部処理したいのですが、部分的でもかまいません。
この部分はこういうマクロで出来るというのがありましたら、どなたかサンプルの様
なものを作っていただけると有り難いのですが。
また、秀丸のマクロでは、こういう処理は無理という部分がありましたらそれも教え
ていただきたいです。

よろしくお願いします。

[ ]
RE:05085 カッコの中の文字を抜き出し別名No.05086
ENCODINGSHIFTJIS さん 06/03/06 13:42
 
1. の前半は grep 現在の内容 をして、行番号削除でできる。

[ ]
RE:05086 カッコの中の文字を抜き出し別名No.05087
ENCODINGSHIFTJIS さん 06/03/06 15:22
 
3. は全置換 2回
-([ .0-9][ .0-9][ .0-9]-) → -  \1
-([ .0-9][ .0-9][ .0-9][ .0-9]-) → - \1

[ ]
RE:05087 カッコの中の文字を抜き出し別名No.05088
ENCODINGSHIFTJIS さん 06/03/06 15:29
 
エデイタ操作の主軸は以上で、あとは 「地味」にヘルプ等を参考に
組み立てます。 uniq や SORT は外部コマンド起動でもよいでしょう

[ ]
RE:05085 カッコの中の文字を抜き出し別名No.05089
山紫水明 さん 06/03/06 20:42
 
 W.Hiroshiさん,こんばんは。

 とりあえず次のマクロで試してください。

//---------------------------------------------------------------//
$name = leftstr( basename2, strlen( basename )- 4 ) + "[TL]"
        + rightstr( basename2, 4 );
selectall;
copy;
newfile;
paste;
replaceallfast "^.*\\(\\f.+\\f\\)", "\\1", regular;
replaceallfast "-\\f[0-9.]{3}\\f-", "\\0  \\1\\2", regular;
replaceallfast "-\\f[0-9.]{4}\\f-", "\\0 \\1\\2", regular;
//execmacro "LineSimplify.mac";
saveas $name;
endmacro;
//---------------------------------------------------------------//

 下から3行目はマクロライブラリにある拙作マクロ「重複行を削除する簡易
マクロ」を使用する場合です。これでソートもできます。

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

[ ]
RE:05089 カッコの中の文字を抜き出し別名No.05091
W.Hiroshi さん 06/03/08 16:53
 
ENCODINGSHIFTJIS さん、山紫水明さん、早速のコメント有り難うございました。

早速コメントいただきながら、仕事の都合で時間がとれず、また、自分でよく試しも
しないで「うまくいかないから直してください」というわけにも行かないと思い、
色々試していた為、対応が遅くなってしまいました、申し訳ありません。

前回、投稿文が長く長くなってしまったので、さらにあまり長いサンプルを乗せては
迷惑かななどと思い、サンプルを省略してしまったので、よく伝わらなかったかもし
れませんが、実際には、

N30(..T03-CD..)
G54G90G00X-10.0Y-16.0S1000
G43Z30.0H03
M13
G98G81Z-1.0R2.0F50L0
M98P1030
M98P1031
G80M15
N39M98P99
M01
T04M06
T05

N40(..T04-9.0-DR..)
G54G90G00X-10.0Y-16.0S530

という様に、加工用プログラムの一部になります。
それで、新しいファイルに書き出すのは、カッコに囲まれた文字列だけを抜き出して、
それ以外の文字は含まれない様にしたいのです。

カッコの行だけを切り出すというのは、ENCODINGSHIFTJIS さん からのコメントに
あった様に、localgrep を使えばなんとかなりそうですね。

新しいファイル名で保存する部分と、小数点をそろえるという点は山紫水明さんのマ
クロで、想定通りの動作です。
重複行削除も、紹介いただいたマクロで、実現できそうです。是非使わせていただき
たいです。

ただ、localgrepを使ってカッコの行だけを取り出した後、山紫水明さんのマクロを
そのまま実行すると、文字列としては想定した様な文字列を取り出すことが出来ます
が、grepの結果を表示している段階で新しいウィンドウが開かれているので、そこか
らファイル名を取り出すことが出来ないです、最初にファイル名を取り出して、新し
いファイルを作りそこにgrepの結果の中身をコピーするにはどうすればいいでしょう
か。
それとも、他にもっとスマートな方法があれば教えてください。

また、山紫水明さんに紹介いただいた、LineSimplify.mac と言うマクロで、設定を
あらかじめ固定しておいて、メニューを出さずに実行することは出来ますか。


[ ]
RE:05091 カッコの中の文字を抜き出し別名No.05092
山紫水明 さん 06/03/08 20:18
 
 W.Hiroshiさん,こんばんは。

 次のようにしたらいかがでしょう。
//------------------------------------------------------------------//
$name = leftstr( basename2, strlen( basename )- 4 ) + "[TL]"
        + rightstr( basename2, 4 );
localgrep "^N[0-9]+\\(.+\\)", regular;
replaceallfast "^.+?: ", "", regular;
#grephandle = hidemaruhandle(0);
selectall;
copy;
newfile;
paste;
replaceallfast "^.*\\(\\f.+\\f\\)", "\\1", regular;
replaceallfast "-\\f[0-9.]{3}-", "\\0  \\1", regular;
replaceallfast "-\\f[0-9.]{4}-", "\\0 \\1", regular;
closehidemaruforced #grephandle;
//execmacro "LineSimplify.mac";
saveas $name;
endmacro;
//------------------------------------------------------------------//

>また、山紫水明さんに紹介いただいた、LineSimplify.mac と言うマクロで、
>設定をあらかじめ固定しておいて、メニューを出さずに実行することは出来ま
>すか。

 これは LineSimplify.mac 自体を書きかえればできると思いますが,いろいろ
見直すところがあるかも知れませんので,ここでは勘弁してください。

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

[ ]
RE:05092 カッコの中の文字を抜き出し別名No.05093
W.Hiroshi さん 06/03/08 22:16
 
山紫水明さん こんばんは  W.hiroshiです

早速マクロを作成していただき、有り難うございました。
まさに想定通りの結果が出ました。


> これは LineSimplify.mac 自体を書きかえればできると思いますが,いろいろ
>見直すところがあるかも知れませんので,ここでは勘弁してください。

こちらの件は了解しました。

いつもお世話になりっぱなしで申し訳ありません。
これからもよろしくお願いします。


[ ]