文字列調査のマクロについてNo.09067
ケノービ さん 19/09/25 10:26
 
秀丸のマクロで下記のようなことを行いたいのですが、自分では出来ないため、どな
たかにお知恵をお借りしたく投稿します。
(初めて投稿させていただくのですが、このような投稿がここには馴染まないもので
ある場合は、ご容赦のうえご指摘いただければありがたいです)
---------
●あるファイル中で、行ごとに既定のテキストを調査する。

●各行に2か所存在する、
/**-**/(**は半角英文字)の文字列を調査し、
/**-**/の**の文字のセットが同じなら問題なし、
/**-**/の**の文字のセットが異なる場合は問題ありとする。
例)
ある行に、
/ab-CD/と/ab-CD/の2つが存在する場合は問題なし、
/ab-CD/と/ef-GH/の2つが存在する場合は問題あり。
※調査対象文字列は、
/(スラッシュ) 半角英字 半角英字 -(ハイフン) 半角英字 半角英字 /(スラッシュ)
の形式の全7バイトとなります。
※-(スラッシュ)の前は英小文字が2文字、後ろは英大文字が2文字です。
●/**-**/の文字列が1つまたは3つ以上存在する行は無視する(調査対象外とする)。
●最終的には、問題のある行以外は削除して、問題のある行のみを残す。
(マクロによる調査終了後に、問題のある行だけとなったファイルを手動で別名保存
したい)
---------
上記のようなマクロを作成できる方がおられましたら、よろしくお願いします。

[ ]
RE:09067 文字列調査のマクロについてNo.09070
IKKI さん 19/09/25 14:45
 
こんにちは。ユーザーのIKKIと申します。

ご希望の作業はマクロを使うまでもなく、Grepで実現できそうです。

[検索]-[grepの実行]
 検索する文字列: (/\c\c-\c\c/).*\1
 検索するファイル: (現在の内容)
 正規表現: ON
 ヒットしない行: ON

同じ作業をマクロで書けば
localgrep "(/\\c\\c-\\c\\c/).*\\1", regular, unmatch;

という感じでいかがでしょうか。

[ ]
RE:09070 文字列調査のマクロについてNo.09074
ケノービ さん 19/09/25 18:30
 
IKKIさま

早々にレスポンスをいただき、ありがとうございます。

Grepでもできるのですね!
ご教示いただいた内容で試してみたのですが、

/**-**/(**は半角英文字)の文字列を調査するのですが、
「/**-**/の**の文字のセットが同じなら問題なし、
 /**-**/の**の文字のセットが異なる場合は問題ありとする」
の部分がどうもうまくヒットしないようで、
/**-**/の形式のセット同志の内容を比較するのではなく、
/**-**/が存在する場合に「同じセットがない行を抽出」しているように思います...。

私の使用方法が間違っているかもしれないので、
もう少し試してみます。

まずはお礼とご報告まで。
よろしくお願いいたします。


>こんにちは。ユーザーのIKKIと申します。
> ......
>という感じでいかがでしょうか。

[ ]
RE:09074 文字列調査のマクロについてNo.09075
IKKI さん 19/09/25 20:25
 
ケノービさん、こんばんは。

要件定義が不明確なので、まずは取っ掛かりとなる方法を提示してみました。
あとはケノービさんの要件に合わせて工夫していただければと思います。

私の手元では、以下のテストケースを作って、とりあえず目的が達成できそうだとい
う感触を得ています。

▼処理前
xxxxxx/ab-CD/xxxxxx/ab-CD/xxxxxx
xxxxxx/ab-CD/xxxxxx/ef-GH/xxxxxx
xxxxxx/ef-GH/xxxxxx/ab-CD/xxxxxx
xxxxxx/ef-GH/xxxxxx/ef-GH/xxxxxx

▼処理後
(2): xxxxxx/ab-CD/xxxxxx/ef-GH/xxxxxx
(3): xxxxxx/ef-GH/xxxxxx/ab-CD/xxxxxx

処理前のテキストと処理後のテキストの具体例を提示していただければ、その仕様に
合わせて適当なマクロを作ってみることもできると思います。

[ ]
RE:09074 文字列調査のマクロについてNo.09076
IKKI さん 19/09/25 21:01
 
すみません、仕様中の「無視する(調査対象外とする)」を「その行を残す(何もし
ない)」と解釈しましたが、どうやら違ったようですね。
ご提示の仕様では、以下の【】部分の要件が読み取れませんでした。

・行内に「/**-**/」が存在しない場合、その行を【残す/残さない/どちらでもよい】
・行内に「/**-**/」が1個だけ存在する場合、その行を【残す/残さない/どちらで
もよい】
・行内に「/**-**/」が2個だけ存在する場合、
  →2個の「/**-**/」が一致すれば、その行を残さない
  →2個の「/**-**/」が一致しなければ、その行を残す
・行内に「/**-**/」が3個以上存在する場合、その行を【残す/残さない/どちらで
もよい】

また、「/**-**/(**は半角英文字)」に合致するが「-の前は英小文字が2文字、後
は英大文字が2文字」に合致しない文字列(例: /Ij-kL/ )の扱いも不明確です。

以上の要件が明確になれば、何らかのマクロを作ってみることができそうです。

[ ]
RE:09076 文字列調査のマクロについてNo.09079
ケノービ さん 19/10/02 16:20
 
IKKIさま

ご確認ありがとうございます。
出張等でご返信が遅くなってしまってすいません。
ご質問の件は、下記が希望です。

・行内に「/**-**/」が存在しない場合、その行を【残さない】
・行内に「/**-**/」が1個だけ存在する場合、その行を【残さない】
・行内に「/**-**/」が2個だけ存在する場合、
  →2個の「/**-**/」が一致すれば、その行を残さない
  →2個の「/**-**/」が一致しなければ、その行を残す
・行内に「/**-**/」が3個以上存在する場合、その行を【残さない】

また、「/**-**/(**は半角英文字)」に合致するが「-の前は英小文字が2文字、後
は英大文字が2文字」に合致しない文字列(例: /Ij-kL/ )の扱いも不明確です。
 →この場合は、その行を【残さない】が希望です。

恐縮ですが、可能であれば、
よろしくお願いいたします。

[ ]
RE:09079 文字列調査のマクロについてNo.09080
IKKI さん 19/10/03 12:32
 
その要件でしたら、こんな感じのマクロでいかがでしょうか。
(正規表現を工夫すればもうちょっと短く書くこともできますが、学習用として分か
りやすいよう、少し冗長な書き方をしています)

// 「/**-**/」が2個以上存在する行を抽出
localgrep "(/[a-z]{2}-[A-Z]{2}/).*(/[a-z]{2}-[A-Z]{2}/)", regular;
// 「/**-**/」が3個以上存在する行を削除
replaceallfast "^.*/[a-z]{2}-[A-Z]{2}/.*/[a-z]{2}-[A-Z]{2}/.*/[a-z]{2}-[A-Z]
{2}/.*\\n", "", regular;
// 2個の「/**-**/」が同じである行を削除
replaceallfast "^.*(/[a-z]{2}-[A-Z]{2}/).*\\1.*\\n", "", regular;

▼処理前
xxxx/aa-AA/xxxx
xxxx/ZZ-zz/xxxx
xxxx/aa-AA/xxxx/aa-AA/xxxx
xxxx/aa-AA/xxxx/bb-BB/xxxx
xxxx/aa-AA/xxxx/ZZ-zz/xxxx
xxxx/ZZ-zz/xxxx/aa-AA/xxxx
xxxx/ZZ-zz/xxxx/ZZ-zz/xxxx
xxxx/aa-AA/xxxx/bb-BB/xxxx/bb-BB/xxxx
xxxx/aa-AA/xxxx/aa-AA/xxxx/bb-BB/xxxx
xxxx/aa-AA/xxxx/aa-AA/xxxx/aa-AA/xxxx

▼処理後
(4): xxxx/aa-AA/xxxx/bb-BB/xxxx

[ ]
RE:09080 文字列調査のマクロについてNo.09088
ケノービ さん 19/10/08 16:53
 

IKKIさま

いただいたマクロを動かしてみたところ....
完璧に行いたい処理が完了しました!

ありがとうございます、という言葉だけでは感謝しきれませんが、
お礼を申し上げます。

今後とも、よろしくお願いいたします。

取り急ぎ、お礼とご報告まで!


>その要件でしたら、こんな感じのマクロでいかがでしょうか。
> ......
>(4): xxxx/aa-AA/xxxx/bb-BB/xxxx

[ ]