マクロによる検索と置換についてNo.09868
tack さん 22/05/28 01:32
 
いつもお世話になっております。
マクロを組んで、特定の言葉を検索し、該当箇所に対し置換(もしくは挿入)をした
いと考えております。

対象文字列が
"adv_name":"名前" "fist_line_text":"「
"adv_name":"" "fist_line_text":"「

の2つの文字列があります。

"adv_name":"" "fist_line_text":"「
"adv_name":"名前" "fist_line_text":"「
の順もあれば、

"adv_name":"名前" "fist_line_text":"「
"adv_name":"" "fist_line_text":"「
の順もあります。

※名前の内容で、花子とかアーサーなど平仮名、片仮名、漢字で構成された文字列に
なります。

名前にあたる場所を検索し、文字列
"adv_name":"" "fist_line_text":"「
の""の間に挿入をしたいと考えています。

//--------------------------------------
setcompatiblemode 0x00020000;
gofiletop;
#i = 0;
while( 1 ) {
    searchdown2 "(?<=\"adv_name\":\").+(?=\" \"fist_line_text\":\"「)", regu
lar;
    if( !result ) break;
    $s = gettext( foundtopx, foundtopy, foundendx, foundendy );
}


これで検索はできると思ったのですが、置換はどうすればよいのか分かりません。
ご教授いただければ幸いです。

[ ]
RE:09868 マクロによる検索と置換についてNo.09869
Iranoan さん 22/05/28 01:55
 
tack さん今日は Iranoan です
> 対象文字列が
> "adv_name":"名前" "fist_line_text":"「
> "adv_name":"" "fist_line_text":"「
<snip>
> 名前にあたる場所を検索し、文字列
> "adv_name":"" "fist_line_text":"「
> の""の間に挿入をしたいと考えています。
回答ではないので申し訳ありませんが、結局どういう結果になるのが希望なのでしょう

"" の間に何を挿入したいのか? が解りません
> ※名前の内容で、花子とかアーサーなど平仮名、片仮名、漢字で構成された文字列
>になります。
「名前」部分の文字列によって挿入する内容が異なるなら、別途変換テーブルを用意
し、そこから取り出した内容を書き込むようにすれば良いともいます

また
> "adv_name":"" "fist_line_text":"「
> "adv_name":"名前" "fist_line_text":"「
> の順もあれば、
>
> "adv_name":"名前" "fist_line_text":"「
> "adv_name":"" "fist_line_text":"「
> の順もあります。
とのことですが、書式が統一されていないと、具体的な回答は出いないと思います
これだけでは全体のフォーマットが不明で "" に対応する「名前」部分が上下どちら
を参照するのか判らないので

[ ]
RE:09869 マクロによる検索と置換についてNo.09870
tack さん 22/05/28 03:10
 
Iranoan さん、お世話になります。

"adv_name":"" "fist_line_text":"「 を
"adv_name":"名前" "fist_line_text":"「に統一したいのです。

名前は異なると伝えましたが、テキストの内容には名前は一種類しか登場しません。


頭から検索をかけて、その検索の結果で"名前"に該当する部分を保持し、""の部分に
挿入できればと思いました。
ただ頭から検索する場合、仰る通り

"adv_name":"" "fist_line_text":"「 が先に記述されていると、検索で希望の結果
が求められないと考え、どちらの順も存在しうると書きました。

[ ]
RE:09868 マクロによる検索と置換についてNo.09871
h-tom さん 22/05/29 21:45
 
h-tom です。

>これで検索はできると思ったのですが、置換はどうすればよいのか分かりません。
>ご教授いただければ幸いです。
$s に目的のものが取り込まれているなら、以下のようにすれば置換できると思いま
すよ。

replaceall "\"adv_name\":\"\"", "\"adv_name\":\"" + $s + "\"";

[ ]
RE:09871 マクロによる検索と置換についてNo.09872
tack さん 22/05/30 03:07
 
h-tom様

ご返信ありがとうございます。仰る通りの構文で目的が達成できました、ありがとう
ございます!


別にもう一点お伺いしたいのですが
重複行の削除を自身のマクロ内で行いたいため、キー操作によって下記のマクロを
キーマクロとして追加したところ全文削除されてしまいました。
なにか誤りがあるのでしょうか?

キー操作内容
すべて選択
編集→変換→ユニークを選択(ユニークのバージョンは1.00)

キーマクロ内容
//重複行削除
selectall;
filter "Uniq.hmf" , "Uniq";

キー操作時に行いたい重複行削除が実行されているのは確認しております。

[ ]
RE:09872 マクロによる検索と置換についてNo.09873
秀丸担当 さん 22/05/30 13:49
 
Uniqは、ライブラリにあるm.fujiさんの作られたものかと思います。
これで試してみたところでは、メニューからの操作でも、マクロでもできるようでし
た。
キー操作の再生でも問題ないようでした。
変換モジュールによっては、filter文の第3パラメータが必要になることもあります
が、Uniq.hmfの場合は無くてもいいようです。
違うマクロが実行されているかもしれないので、確かに目的のマクロが実行されてい
るか確認するために、message文とか入れてみると原因を探ることができると思います。

[ ]
RE:09873 マクロによる検索と置換についてNo.09874
tack さん 22/06/03 05:29
 
秀丸担当様、ご返信ありがとうございます。
setcompatiblemodeを依然作った別のもので指定したまま行ってしまったのが原因で
あったようです。
setcompatiblemode 0x0F;として実行してみた所、上手く動作しました。ありがとう
ございます。

また別の内容を少し教えていただきたく思います。
下記文章があるとします

image bg yy_00:
image bg yy_11:
image bg yy_22:
image bg yy_33:
image bg yy_44:

show image xxx_a_01
show image xxx_a_02
show image xxx_a_03
show image xxx_a_04
show image xxx_a_05

※xxx_a_ 以降の2桁の数値はファイル毎にランダムであり、01〜05はといった固定
数字ではありません。
※yy_ 以降の数字はファイル毎に変更はないものです。

xxx_a_ 以降の01,02,03,04,05といった数値を変数として取得し、
yy_00などの00を01,11を02といった様に置換を行う場合

setcompatiblemode 0x00020000;
gofiletop;
#i = 0;
while( 1 ) {
    searchdown2 "(?<=bg .*_h_).+", regular;
    if( !result ) break;
    $p = gettext( foundtopx, foundtopy, foundendx, foundendy );
}

#i = 0;
while( 1 ) {
    searchdown2 "(?<=show bg .*_h_).+", regular;
    if( !result ) break;
    $q = gettext( foundtopx, foundtopy, foundendx, foundendy );
}

golinetop;
replaceall "bg yy_00 ", "bg yy_" + $p + ":";
replaceall "bg yy_00 ", "bg yy_" + $q + ":";

message $p;
message $q;

とマクロを書いてみたのですが、なぜか$pは「05」を取得し返してきており、$q以降
は「05」以降の検索対象が存在しないこととなり変数の取得が行われません。
マクロの記載が不慣れなのと、説明が分かりにくいかと思いますが、アドバイスをい
ただければと思います。

[ ]
RE:09874 マクロによる検索と置換についてNo.09875
でるもんたいいじま さん 22/06/03 09:18
 
でるもんた・いいじまです。

> また別の内容を少し教えていただきたく思います。
> 下記文章があるとします
>
> image bg yy_00:
> image bg yy_11:
> image bg yy_22:
> image bg yy_33:
> image bg yy_44:
>
> show image xxx_a_01
> show image xxx_a_02
> show image xxx_a_03
> show image xxx_a_04
> show image xxx_a_05
>
> ※xxx_a_ 以降の2桁の数値はファイル毎にランダムであり、01〜05はといった固
>定数字ではありません。
> ※yy_ 以降の数字はファイル毎に変更はないものです。
>
> xxx_a_ 以降の01,02,03,04,05といった数値を変数として取得し、
> yy_00などの00を01,11を02といった様に置換を行う場合

ちょっとここの時点で意味不明です。
「ランダム」なのであれば、本当にランダムな実例を示していただいたほうが理解が
進みます。

上記のスクリプトの文面から想像して、背景画像 yy_** と前景画像 xxx_a_** とで
番号を揃えたい、という意味に読み取れましたが、それで間違いないでしょうか?

つまり、たとえば

@
> image bg yy_98:
> image bg yy_37:
> image bg yy_23:
>
> show image xxx_a_45
> show image xxx_a_58
> show image xxx_a_02

というデータを

A
> image bg yy_45:
> image bg yy_58:
> image bg yy_02:
>
> show image xxx_a_45
> show image xxx_a_58
> show image xxx_a_02

に書き換えたい、ということで合っていますか?
そうでないとすれば、@の実際のデータを最終的にどんな文面にしたいのか示してい
ただければマクロが書けます。

☆ ☆ ☆

で、実際のマクロを見ていきます。

> searchdown2 "(?<=bg .*_h_).+", regular;

この時点で、このパターンに一致するテキストが全く存在しません。
_h_ という3文字の並びは例文中に全く存在しません。
再確認願います。

> gofiletop;
> #i = 0;
> while( 1 ) {
>     searchdown2 "(?<=bg .*_h_).+", regular;
>     if( !result ) break;
>     $p = gettext( foundtopx, foundtopy, foundendx, foundendy );
> }

ここまでで、「最後に見つかった1つのみ」を $p に保存しています。
なので $p が "05" 固定になるのは当然です。
一つ一つ取り出して一つ一つ置換するには、いったん配列に入れておくか、あるいは
 while ループの中に replace 文を入れるか、どちらかになります。
配列を使うことを意図して #i=0; としているようですが、そもそも while の内側で
 #i の値を 1, 2, 3, ... と増やす作業が行われていません。

> #i = 0;
> while( 1 ) {
>     searchdown2 "(?<=show bg .*_h_).+", regular;
>     if( !result ) break;
>     $q = gettext( foundtopx, foundtopy, foundendx, foundendy );
> }

こちらは「show bg 」がそもそも存在しないので、$q が取得できません。
仮に取得できたとしても $p の場合と同様、最後に見つかった一つのみが $q に保存
されます。
#i の問題点がこちらにもあります。

> golinetop;
> replaceall "bg yy_00 ", "bg yy_" + $p + ":";
> replaceall "bg yy_00 ", "bg yy_" + $q + ":";

残念ながらここは意味不明です。これは現時点では
replaceall "bg yy_00 ", "bg yy_05:";
replaceall "bg yy_00 ", "bg yy_:";
と解釈されているので、仮に1行目が成功したとすると、2行目で置換元にする "bg_0
0 " は既に丸ごと消えています。

> マクロの記載が不慣れなのと、

というか、プログラミング全般が根本的に不慣れなように感じられます。
どんな言語でも結構ですから、一般のプログラミングをきちんと勉強されたほうがい
いと思います。

(初心者がコンソールアプリを作るための言語としては何がいいんでしようかね…昭
和から平成一桁の時代にはBASICがあったんですが、今なら C++ か Perl あたりでし
ょうか?)

[ ]
RE:09875 マクロによる検索と置換についてNo.09876
igus さん 22/06/04 09:02
 
でるもんた・いいじまさん、こんにちは。

> (初心者がコンソールアプリを作るための言語としては何がいいんでしようかね…
>昭和から平成一桁の時代にはBASICがあったんですが、今なら C++ か Perl あたり
>でしょうか?)


使い慣れてるってこともあるんですが個人的にお勧めしたいのは ruby です。
加工したいテキストをいったんクリップボードにいれるとかファイルに書き出すとか
してそれを ruby で処理、クリップボード経由あるいは使い捨ての秀丸マクロを作っ
て呼び出して秀丸に返すという方法で秀丸マクロを作ってます。
秀丸マクロだけでは難しいような処理をサクッと作れて便利です。

http://pansy.s1010.xrea.com/category/hide-ruby/

[ ]
RE:09875 マクロによる検索と置換についてNo.09877
tack さん 22/06/04 22:19
 
でるもんた・いいじま様

まずはご返信ありがとうございます。仰る通り求める結果は
@というデータをAにしたいということになります。

また
searchdown2 "(?<=bg .*_h_).+", regular;
はこちらの入力ミスとなりまして

searchdown2 "(?<=show image .*_a_).+", regular;
になります。

また、こちらは「show bg 」がそもそも存在しないので、$q が取得できません。の件も

searchdown2 "(?<=image .*_a_).+", regular;
if( !result ) break;
$p = gettext( foundtopx, foundtopy, foundendx, foundendy );



searchdown2 "(?<=image .*_h_).+", regular;
if( !result ) break;
$q = gettext( foundtopx, foundtopy, foundendx, foundendy );

がお伝えしたかったものとなります。

未熟な自分に対しアドバイスいただきありがとうございます。また文面のミスにつき
ましては申し訳ありませんでした。

[ ]
RE:09877 マクロによる検索と置換についてNo.09878
igus さん 22/06/07 12:31
 
tackさん、こんにちは。

試しに作ってみたのですが、勘違いしてるかも知れません。
こんな感じでどうでしょう?

setcompatiblemode 0x00020000;
begingroupundo;gofiletop;
#i = 0;#j=0;
while(1){
  searchdown2 "image [^ ]+_a_\\d+", regular;
  searchdown2 "(?<!\\d)\\d+$", regular,inselect;
  if(!result) break;
  $p[#i] = gettext( foundtopx, foundtopy, foundendx, foundendy );
  //message $p[#i];
  #i=#i+1;
}
gofiletop;
while(#j<#i){
  replacedown "bg yy_\\d+","bg yy_" + $p[#j] + ":",regular;
  #j=#j+1;
}
endgroupundo;


[ ]
RE:09878 マクロによる検索と置換についてNo.09879
tack さん 22/06/07 20:24
 
igus様、こんにちは。

ご指導ありがとうございます。
お伺いしたいのですが、

searchdown2 "(?<!\\d)\\d+$", regular,inselect;
↑の行は何を[0-9]から始まらず、[0-9]が続くものを検索しているということでしょ
うか?

//message $p[#i];
↑のメッセージはどういった意味を持つのでしょうか?
  #i=#i+1;


最初からしっかり書いておけばよかったのですが
実際に行う文について

@
image bg 0925_h_01 = Scale("SP/0925_h_01.png", 1920, 1080)
image bg 0925_h_02 = Scale("SP/0925_h_02.png", 1920, 1080)
image bg 0925_h_03 = Scale("SP/0925_h_03.png", 1920, 1080)

show bg 0925_h_21
show bg 0925_h_44
show bg 0925_h_32


といった表記になり、これを
A
image bg 0925_h_21 = Scale("SP/0925_h_21.png", 1920, 1080)
image bg 0925_h_44 = Scale("SP/0925_h_44.png", 1920, 1080)
image bg 0925_h_32 = Scale("SP/0925_h_32.png", 1920, 1080)

show bg 0925_h_21
show bg 0925_h_44
show bg 0925_h_32

としたい場合、先のマクロの
searchdown2 "image [^ ]+_a_\\d+", regular; を
searchdown2 "show bg [^ ]+_h_\\d+", regular; と変更し、

replacedown "bg yy_\\d+","bg yy_" + $p[#j] + ":",regular; を
replacedown "image bg [^ ]+_h_\\d+ ","image bg [^ ]+_h_" + $p[#j] + " ",regu
lar; といったように変更するのでしょうか?

度々の質問申し訳ありません。

[ ]
RE:09879 マクロによる検索と置換についてNo.09880
tack さん 22/06/07 20:40
 
追記になりますが、上記投稿にある中の0925という数字は別のファイルの場合、4桁
の異なる数字が入ります。
その数字はファイル毎に異なりますが、ファイルの中では必ず同一の数字となってい
ます。

例えになりますが、AとBというファイルがある場合
Aは0925といった数字が入り、Bは0100といった数字が入っています。
Aの中では0925がある場所は、必ず0925が入っており、Bなら同じ場所に0100が必ず
入っています。

[ ]
RE:09880 マクロによる検索と置換についてNo.09881
igus さん 22/06/08 01:05
 
tackさん、こんにちは。

> searchdown2 "(?<!\\d)\\d+$", regular,inselect;
> ↑の行は何を[0-9]から始まらず、[0-9]が続くものを検索しているということでし
>ょうか?

そういうことです。

> //message $p[#i];
> ↑のメッセージはどういった意味を持つのでしょうか?

コメントアウトしているので、実際は働きませんが配列$p[#i]の中身を調べられるよ
うにつけてあります。
show bg 0925_h_21
show bg 0925_h_44
show bg 0925_h_32
の場合だと配列$p[#i]=[21,44,32]となります。
(?<!\\d)を付けない場合だと配列$p[#i]=[21,1,44,4,32,2]となってしまい失敗しま
した。

修正版

setcompatiblemode 0x00020000;
begingroupundo;gofiletop;
#i=0;#j=0;
while(1){
  searchdown2 "show .*_h_\\d+",regular;
  searchdown2 "(?<!\\d)\\d+$",regular,inselect;
  if(!result) break;
  $p[#i]=gettext(foundtopx,foundtopy,foundendx,foundendy);
  #i=#i+1;}
gofiletop;
setsearch "image [^$]+" , 0x4003819;
while(#j<#i){
  finddown2;
  $q[#j]=gettext(foundtopx,foundtopy,foundendx,foundendy);
  #px[#j]=foundtopx;#py[#j]=foundtopy;#dx[#j]=foundendx;#dy[#j]=foundendy;
  #j=#j+1;}
#j=0;
while(#j<#i){
  moveto #px[#j],#py[#j];beginsel;moveto #dx[#j],#dy[#j];
  replaceall "_h_\\d+","_h_"+$p[#j],regular,inselect2;
  #j=#j+1;}
endgroupundo;


[ ]
RE:09881 マクロによる検索と置換についてNo.09882
tack さん 22/06/08 19:40
 
igus様、お世話になっております。
ご提案いただいたマクロで確かに動作出来ました。

また別の内容があったので自身でも以前のigus様が描かれたマクロを読み、参考にし
つつ作ってみましたが、どうにも不格好なのでこちらも参考にさせていただき、勉強
してみます!


[ ]