指定した範囲にのみ、置換をするマクロ文No.10051
初心者です さん 23/01/09 16:34
 
初めて書き込みます。

下記のようなCSVの3列目だけを、3文字ずつ改行する
秀丸マクロのコードを教えていただけないでしょうか。
どうしても出来ず困っています。


あああ,いいいい,うううううううううう
えええ,おおおお,かかかかかかかかかか
ききききき,くく,けけけ
ここ,ささささささささ,しししししししし




求める結果は下記になります。



あああ,いいいい,ううう
ううう
ううう

えええ,おおおお,かかか
かかか
かかか

ききききき,くく,けけけ
ここ,ささささささささ,ししし
ししし
しし




◆CSVの3列目だけを検索するには、検索で

^(.*?),(.*?),(.*?)$(?\3)

◆3文字ずつ改行するには

置換前
^.{3}\f

置換後
\0\n

・・・ここまでは分かるのですが、
それぞれを上手く接続できません。


すみませんが、どなたかヒントをいただけると大変助かります。

[ ]
RE:10051 指定した範囲にのみ、置換をするNo.10052
igus さん 23/01/09 23:00
 
初心者ですさん、こんにちは

置換前
(.*?,.*?,|^).{3}(?!$)

置換後
\0\n

でどうでしょう。
要素が一つだけの場合も三文字で改行してしまうのが難点ですが。

[ ]
RE:10052 指定した範囲にのみ、置換をするNo.10053
初心者です さん 23/01/10 12:40
 
igusさん、ご回答いただき誠にありがとうございます。

できました!本当にありがとうございます!!
これから、回答いただいた正規表現を紐解いて勉強してみます。


igusさんの回答は置換1発で出来るものでしたが、

@検索である部分をヒットさせる。
(今回の例でいう、csv3列目)
Aヒットした部分だけに、新たに置換を適用する
(今回の例でいう、3文字ずつで改行)

という2段構えのマクロ文はあまり使わないものなのでしょうか?
この2段構えのマクロ文が調べても見つからなかったんです。
今回はigusさんの回答で無事解決しましたが、今後のために知りたく。





[ ]
RE:10053 指定した範囲にのみ、置換をするNo.10054
igus さん 23/01/10 15:41
 
言われて2パターンほど考えてみましたが
とうもよく分からない点が出てきました。

//三番目を三文字で改行(その1).mac
setcompatiblemode 0x00000200;
begingroupundo;gofiletop;
while(1){
  searchdown2 "^(.*?),(.*?),(.*?)$(?\\3)", regular,nohilight;
  if(!result)break;
  #x=x;#y=y;
  replaceall ".{3}(?!$)","\\0\\n",regular,inselect2;
  moveto #x,#y;//無限ループ回避
}
endgroupundo;endmacro;

//三番目を三文字で改行(その2).mac
setcompatiblemode 0x00100200;
begingroupundo;
setsearch "^(.*?),(.*?),(.*?)$(?\\3)" , 0x4003819;
selectallfound;
replaceallfast ".{3}(?!$)","\\0\\n",regular,inselect2;
endgroupundo;endmacro;

(その1)の方は moveto #x,#y; を入れないと先頭の行に戻って
無限ループになってしまうのですがどうしてこんな動作になるのでしょう?
もっとスマートな解決策があれば知りたいです。

また(その2)の方は(その1)を動作させた後なら
ちゃんと動いてくれるようですが連続で実行すると選択に失敗して
うまく動かないようです。

どなたかに添削していただきたいです。

[ ]
RE:10054 指定した範囲にのみ、置換をするNo.10055
秀丸担当 さん 23/01/10 17:29
 
確かに変だと思い、調べてみました。

(その1)については、replaceallに失敗したとき、カーソルがファイル先頭に行っ
てしまうためのようでした。
そのため、replaceallfastが失敗したら、元のカーソル位置に戻す必要がありました。
範囲なしの場合は、同じくファイル先頭でした。
選択した範囲がinselectで行単位の場合の動作は、失敗したら選択行の一番上の行に
行きました。
カーソルが動かないように修正が必要かと考えましたが、上記2つの動作は変わるの
で、ヘルプに注意書きを書いておこうと思います。

合わせるなら、複数選択のうち一番目の選択の先頭だとよかったかもしれないです。
それはそれで微妙なのと、動作を変えたらよくなさそうなので、いじらないでおこう
と思います。

(その2)については、inselect2状態が継続しているためのようでした。
replaceallfast直後に、
escapeinselect;
をすれば大丈夫でした。
replaceallfastの後は、選択した範囲の中間色表示(動作環境の検索の設定)があって
も結果的に無くなるも同然なので、非常にわかりづらいと思います。
とはいえ動作を変えるわけにもいかないので、なんともしがたいところです。
これも注意書きとして書いておこうと思います。

[ ]
RE:10055 指定した範囲にのみ、置換をするNo.10056
igus さん 23/01/10 19:08
 
なるほど、うまくいきました。
一応、改訂版はこんな感じになりました。

//三番目を三文字で改行(その1).mac
setcompatiblemode 0x00000200;
begingroupundo;gofiletop;
while(1){
  searchdown2 "^(.*?),(.*?),(.*?)$(?\\3)", regular,nohilight;
  if(!result)break;
  #x=x;#y=y;
  replaceall ".{3}(?!$)","\\0\\n",regular,inselect2;
  if(!result)moveto #x,#y;//無限ループ回避
}
endgroupundo;endmacro;


//三番目を三文字で改行(その2).mac
setcompatiblemode 0x00100200;
begingroupundo;
setsearch "^(.*?),(.*?),(.*?)$(?\\3)" , 0x4003819;
selectallfound;
replaceallfast ".{3}(?!$)","\\0\\n",regular,inselect2;
escapeinselect;endgroupundo;endmacro;



[ ]
RE:10056 指定した範囲にのみ、置換をするNo.10057
初心者です さん 23/01/10 19:46
 
igusさん、秀丸担当さん

マクロ文を実際に作ってくださり、ありがとうございます。
ずっと知りたかった部分が入っていて大変助かりました。
じっくり解読し、今後似たようなパターンにも使い回させてもらいます。

こんな掲示板があるなんて感激です。
運営者の方にも、回答してくださる方にも感謝です。
ありがとうございました。

[ ]