切り出しの使い方についてNo.23867
yama3yama3 さん 07/10/23 07:49
 
質問させてください。

項目を設定数以下にしたい。
切り出しを使うのだと思うのですがうまくいきません。

例)
b列の0個からn個ある項目を3個以下にしたい。
a列c列は固定文字になります。
xxx,,yyy
xxx,aaa/bbb,yyy
xxx,aaa/bbb/ccc,yyy
xxx,aa1/bb1/cc1/dd1,yyy
xxx,aa2/bb2/cc2/dd2/ee2,yyy

xxx,,yyy
xxx,aaa/bbb,yyy
xxx,aaa/bbb/ccc,yyy
xxx,aa1/bb1/cc1,yyy
xxx,aa2/bb2/cc2,yyy
にしたいのですがよい方法はございますか?
よろしくお願いいたします。




[ ]
RE:23867 切り出しの使い方についてNo.23870
秀丸担当 さん 07/10/23 10:19
 

>b列の0個からn個ある項目を3個以下にしたい。
>a列c列は固定文字になります。

こういった条件の場合は、簡単な操作ではできないと思います。
正規表現で置換をするといろいろできます。
[検索]→[置換]で、

検索文字列 xxx,([^/]+/[^/]+/[^/]+)/.+,yyy
置換文字列 xxx,\1,yyy
「正規表現」のみON

という感じで置換をするとできます。
正規表現についての詳細はヘルプなどを参照してみてください。
難しいかもしれないですが、理解するといろいろ便利になります。

[ ]
RE:23870 切り出しの使い方についてNo.23876
yama3yama3 さん 07/10/23 15:45
 
ご解答ありがとうございます。

>検索文字列 xxx,([^/]+/[^/]+/[^/]+)/.+,yyy
>置換文字列 xxx,\1,yyy
>「正規表現」のみON

応用の範囲かと存じますが
理解が悪くて申し訳ございません。

例)
b列の0個からn個ある項目を3個以下にしたい。
a列c列は固定文字になります。
xxx,,yyy
xxx,aaa,bbb,yyy
xxx,aaa,bbb,ccc,yyy
xxx,aa1,bb1,cc1,dd1,yyy
xxx,aa2,bb2,cc2,dd2,ee2,yyy

xxx,,,,yyy
xxx,aaa,bbb,,yyy
xxx,aaa,bbb,ccc,yyy
xxx,aa1,bb1,cc1,yyy
xxx,aa2,bb2,cc2,yyy
にしたいのですがよい方法はございますか?

マクロで組みたいと思います。
よろしくお願いいたします。



[ ]
RE:23876 切り出しの使い方についてNo.23878
秀丸担当 さん 07/10/23 16:28
 

>xxx,aa1,bb1,cc1,yyy
>xxx,aa2,bb2,cc2,yyy
>にしたいのですがよい方法はございますか?
>
>マクロで組みたいと思います。
>よろしくお願いいたします。

[検索]→[置換]で、

検索文字列 xxx,([^,]+,[^,]+,[^,]+),.+,yyy
置換文字列 xxx,\1,yyy
「正規表現」のみON

でどうでしょうか。
"/"を","に変えただけではありますが。


マクロの場合は、
replaceallfast "xxx,([^,]+,[^,]+,[^,]+),.+,yyy",
    "xxx,\\1,yyy", regular;
と書きます。
マクロの文字列の中は \ を \\ と書く必要があります。

後から気づきましたが空の文字列が入っている場合があるとしたら、
検索文字列は
xxx,([^,]*,[^,]*,[^,]*),.*,yyy
のほうがよかったかもしれません。

[ ]
RE:23878 切り出しの使い方についてNo.23880
yama3yama3 さん 07/10/23 17:21
 
迅速なご解答ありがとうございます。

>後から気づきましたが空の文字列が入っている場合があるとしたら、
>検索文字列は
>xxx,([^,]*,[^,]*,[^,]*),.*,yyy
>のほうがよかったかもしれません。

途中から例を変えてしまって申し訳ございません。
95%位は満足していますが質問ついでに再度ご連絡いたしました。

例)
b列の0個からn個ある項目を3個以下にしたい。
a列c列は固定文字になります。
xxx,,yyy
xxx,aaa,bbb,yyy
xxx,aaa,bbb,ccc,yyy
xxx,aa1,bb1,cc1,dd1,yyy
xxx,aa2,bb2,cc2,dd2,ee2,yyy

xxx,,,,yyy
xxx,aaa,bbb,,yyy
xxx,aaa,bbb,ccc,yyy
xxx,aa1,bb1,cc1,yyy
xxx,aa2,bb2,cc2,yyy
にしたいのですがよい方法はございますか?

3以上は3になっていますが
3未満は0でございます。

対策はございますか?
よろしくお願いいたします。


[ ]
RE:23878 切り出しの使い方についてNo.23881
Kaisan さん 07/10/23 17:38
 
kaisan@ユーザです

足りないカンマを補完したいようなのでこちらの方がよいと思います

検索文字列:xxx,([^,]*),?([^,]*),?([^,]*),?.*yyy
置換文字列:xxx,\1,\2,\3,yyy
「正規表現」のみON

マクロの場合は、
replaceallfast "xxx,([^,]*),?([^,]*),?([^,]*),?.*yyy",
     "xxx,\\1,\\2,\\3,yyy", regular;


◆秀丸担当様へ

 検索文字に
 『xxx,([^,]*),?([^,]*),?([^,]*),.*yyy』や
 『xxx,([^,]*),?([^,]*),?([^,]*),?.*,yyy』などを指定すると
「置換文字列が長すぎて処理できません。」というエラーになりました。

たとえば『^xxx,([^,]*),?([^,]*),?([^,]*),?.*,yyy』で置き換えを実行すると

エラー発生後「xxx,,yyy」が「xxx,xxx,,yyy」になっていました。

もしかして、置き換え後の文字列を再度置き換えてる?

秀丸:7.03
hmjre.dll:1.86

[ ]
RE:23881 切り出しの使い方についてNo.23882
秀丸担当 さん 07/10/23 17:44
 

>◆秀丸担当様へ
>
> 検索文字に
> 『xxx,([^,]*),?([^,]*),?([^,]*),.*yyy』や
> 『xxx,([^,]*),?([^,]*),?([^,]*),?.*,yyy』などを指定すると
>「置換文字列が長すぎて処理できません。」というエラーになりました。

補足ありがとうございます。
ちょうど、このことをコメントしようとして、自分でこの正規表現を書いてみて
この現象に遭遇してしまい、調べようとしていたところでした。
また調べてコメントします。

[ ]
RE:23882 切り出しの使い方についてNo.23888
秀まるお2 さん 07/10/24 09:12
 
 この件ですが、HmJre.dll側のバグでした。大変失礼しました。

 ? がバグってました。

 ちょうど秀丸エディタがV7.04にバージョンアップするタイミングで反映させ
ていただきます。

[ ]
RE:23888 切り出しの使い方についてNo.23889
秀まるお2 さん 07/10/24 09:19
 
 ちなみにですが、とりあえずの回避策としては、

 「,?」

 の所を

 「,{0,1}」

 にすれば回避できるようです。

[ ]
RE:23889 切り出しの使い方についてNo.23904
yama3yama3 さん 07/10/25 02:05
 
crossjoinで教えていただいた下記マクロも
「置換文字列が長すぎて処理できません。」というエラーが出ている様子です。
回避方法はございますか?

disabledraw;
while(1)
{
    replaceallfast "(aaa.*?AAA)(bbb.*?BBB)(bbb.*?BBB)",
                    "\\1\\2\n\\1\\3", regular, casesense;
    if( !result ) break;
}
enabledraw;


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

[ ]
RE:23904 切り出しの使い方についてNo.23905
秀まるお2 さん 07/10/25 09:18
 
 「?」じゃなくて「.*?」を使ってるだけなので、このケースでおかしくなるの
はまた別の問題かと思います。

 具体的にエラーが出るテキストファイルの例があれば教えて欲しいですが…。
出来ればそういうサンプルを、maruo@mitene.or.jp宛にメールで送って欲しいで
す。

 数行程度の内容であればここの会議室に書いていただくだけでいいですけど。

[ ]
RE:23904 切り出しの使い方についてNo.23907
秀まるお2 さん 07/10/25 09:31
 
 ちなみに正規表現のDLL(HmJre.dll)は僕が担当してまして、僕がお返事して
います。

 一応、こちらでテストしたパターンとしては、

aaa.AAAbbb.BBBbbb.BBB
aaaAAAbbb.BBBbbb.BBB
aaa.AAAbbbBBBbbb.BBB
aaa.AAAbbb.BBBbbbBBB
aaaAAAbbbBBBbbb.BBB
aaa.AAAbbbBBBbbbBBB
aaaAAAbbb.BBBbbbBBB
aaaAAAbbbBBBbbbBBB

 っていう文字列を置換してみただけですが、それでは正常動作するようです。
秀丸担当もテストしてみたけどもうまく再現しないらしいです。

[ ]
RE:23907 切り出しの使い方についてNo.23911
白雲斎 さん 07/10/25 11:00
 
こんにちは“秀まるお2”さん“yama3yama3”さん、白雲斎です。

見覚えのあるマクロなので、突っ込みいれます。

“yama3yama3”さんへ:

    秀丸マクロ・ヘルプ
    検索系文−検索/置換文字列の上限について
    ----------------------------------------
    検索文字列の上限は 249 文字まで、
    置換文字列の上限は 259 文字までです。
    ----------------------------------------
    に引っかかっていませんか?

“秀まるお2”さんへ:

    置換文字列は、展開された文字列なんですね!?


-- 検証マクロ --------------------------

//#SIZE = 240; // OK
#SIZE = 250; // NG

newfile;
disabledraw;
insert "aaa";
call Puts "1";
insert "AAAbbb";
call Puts "2";
insert "BBBbbb";
call Puts "3";
insert "BBB\n";
enabledraw;

while(1)
{
    replaceallfast "(aaa.*?AAA)(bbb.*?BBB)(bbb.*?BBB)",
                    "\\1\\2\n\\1\\3", regular, casesense;
    if( !result ) break;
}
endmacro;

Puts:
    ##i = 0;
    while( ##i < #SIZE )
    {
        insert $$1;
        ##i = ##i + 1;
    }
return;

[ ]
RE:23911 切り出しの使い方についてNo.23913
秀丸担当 さん 07/10/25 11:29
 

>    秀丸マクロ・ヘルプ
>    検索系文−検索/置換文字列の上限について
>    ----------------------------------------
>    検索文字列の上限は 249 文字まで、
>    置換文字列の上限は 259 文字までです。
>    ----------------------------------------
>    に引っかかっていませんか?
>
>“秀まるお2”さんへ:
>
>    置換文字列は、展開された文字列なんですね!?

本当に置換文字列が長いのかもしれないですね。
秀丸エディタ本体の処理ですが、置換ダイアログに書く置換文字列の記述は259
文字までですが、タグを使った後の展開された文字列の場合は、1000バイト付近
まで余裕を持たせてあります。
これを超えるとエラーになります。
もしそれが原因なら、単純に増やせば解決することなので、V7.04で8000バイト
付近まで増やしておこうと思います。

[ ]
RE:23913 切り出しの使い方についてNo.23922
yama3yama3 さん 07/10/26 04:38
 

>本当に置換文字列が長いのかもしれないですね。
>秀丸エディタ本体の処理ですが、置換ダイアログに書く置換文字列の記述は259
>文字までですが、タグを使った後の展開された文字列の場合は、1000バイト付近
>まで余裕を持たせてあります。
>これを超えるとエラーになります。
>もしそれが原因なら、単純に増やせば解決することなので、V7.04で8000バイト
>付近まで増やしておこうと思います。

お世話になります。
会話についていけないものですから
超簡単な質問です。(全くの素人なもので)

1.マクロに記述する1行のステートメントの
 replaceallfast "A", "B" ,regular ;
 のAやBに記述する文字数のことでしょうか?
または
2.どこからどこまで<A.*?B><A.+?B>のAからBまでの文字数に
 制限があると言うことなのでしょうか?

今回は2.には該当していますが、1.に関しましてクリアしています。
ちなみに
replaceallfast "a.*?b", "" ,regular ;
a.*?bは数kbになります。この処理を行いながら他の処理をいろいろ
行っています。crossjoin含めまして。

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


[ ]
RE:23922 切り出しの使い方についてNo.23925
秀丸担当 さん 07/10/26 10:37
 

>1.マクロに記述する1行のステートメントの
> replaceallfast "A", "B" ,regular ;
> のAやBに記述する文字数のことでしょうか?
>または
>2.どこからどこまで<A.*?B><A.+?B>のAからBまでの文字数に
> 制限があると言うことなのでしょうか?
>
>今回は2.には該当していますが、1.に関しましてクリアしています。
>ちなみに

259文字というのは1.のことです。
1000文字くらいというのは、2.のことです。
V7.04では、これを8000文字くらいまでにしました。

しかし、一行が数キロバイトにもなるというのであれば、置換でやるのはお勧め
できないです。
1つ1つAからBまでを範囲選択して切り抜き、貼り付けを繰り返すようなマクロ
に作り変えたほうが安全だと思います。
でもそのように作り変えると数万行もあるような場合、動作が遅くなることが考
えられます。

[ ]
RE:23925 切り出しの使い方についてNo.23928
白雲斎 さん 07/10/26 12:28
 
こんにちは“秀丸担当”さん、白雲斎です。

別スレッドにしようかと思ったけれど、流れからここに投稿します。

下記のマクロでは、#SIZE = 8186; とするとエラーなく終了しますが、処理結果
が不正となります。“Y>”の終わり括弧が出力されません。


#SIZE = 8185;  // OK
//#SIZE = 8186;  // エラーにならないが結果が変
//#SIZE = 8187;  // エラー

newfile;
disabledraw;
insert "<A";
#i = 0;
while( #i < #SIZE )
{
    insert "0";
    #i = #i + 1;
}
insert "B>\n";
enabledraw;
replaceall "<A(.+?)B>", "<X\\1Y>", regular;
endmacro;

[ ]
RE:23928 切り出しの使い方についてNo.23929
秀丸担当 さん 07/10/26 14:20
 

>下記のマクロでは、#SIZE = 8186; とするとエラーなく終了しますが、処理結果
>が不正となります。“Y>”の終わり括弧が出力されません。

確かにおかしいようです。
エラーとなるべきところが、エラーとなっていませんでした。
ご指摘ありがとうございます。
以前から問題だったようです。
次のバージョンで修正したいと思います。

[ ]