(発言者削除)No.05690
ならい さん 00/05/06 21:40
 


[ ]
RE:05690 (発言者削除)No.05704
山紫水明 さん 00/05/08 20:52
 
    ならいさん こんばんは。

》これらのマクロで、全角約2万字、半角約5万字の文をカウントしてみると、秀丸
》は約10秒かかるのに対し、WZは約2秒しかかりません。(結果の半角の数字が
》ちょっと違うのも気になりますが)
》これは、それぞれのエディタの特性で、秀丸のカウントをもっと早くすることは
》できないのでしょうか。

 カウントを速くする方法があるかどうかちょっとわかりません。
 字数が違うことについては,例えば,

0123456789
0123456789
0123456789
0123456789
0123456789

の文字数を調べてみたらわかるでしょう。秀丸では,半角50字という結果がでます
が,WZではどうなるのでしょうか?

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


[ ]
RE:05704 (全角テキストの文字数)No.05708
ならい さん 00/05/09 09:26
 
山紫水明さん、こんにちは。
ならいです。

すみません、実は、前回発言をアップしてから、WZのマクロがうまく動いていな
いことがわかり、発言を削除してしまっていました^^;)。

その後、WZのマクロを修正して、次のようなマクロでカウントしてみました。

    jumpfiletop;
    int a=0, b=0;
    while(!iscureof) {
        if (txReadChar(text)>=0x8140) a++; else b++;
        }

> 0123456789
> 0123456789
> 0123456789
> 0123456789
> 0123456789
> の文字数を調べてみたらわかるでしょう。秀丸では,半角50字という結果がで
ます
> が,WZではどうなるのでしょうか?

WZでは、半角55文字にカウントされました。で、考えてみたら、当然でした
^^;)。山紫水明さんのマクロの、改行をカウントしない処理、
>    if(code != 0x0D)
に対応する処理をしていないためでした。お騒がせしました^^;)。

改行やスペース、タブを文字数に入れるかどうかは、何に使用するかによって
違ってくるかと思いますが、文字数でお金をもらう仕事の場合は、キーを叩くと
いう作業が発生する以上、改行やスペースもなんらかの形で文字数に含めたいと
ころです。

(削除した発言にも書きましたが)
上のWZのマクロのカウントでは、全角約25000字、半角55000字のファイルを2秒
ほどでカウントできました。それに対し、秀丸は、13秒もかかりました。
エディタにより、得意な処理、不得意な処理があるんでしょうけれども、それに
しても大きく違うものですね。これだけ差があると、文字数カウントは、秀丸の
マクロでWZをわざわざ開いてやらせたくなったりします^^;)。

ならい


[ ]
RE:05708 (全角テキストの文字数)No.05712
番頭++ さん 00/05/09 18:10
 
>エディタにより、得意な処理、不得意な処理があるんでしょうけれども、それに
>しても大きく違うものですね。これだけ差があると、文字数カウントは、秀丸の
>マクロでWZをわざわざ開いてやらせたくなったりします^^;)。

「秀丸エディタ」のマクロを速くするコツは、
変数を減らす、while ループを減らす、検索・置換を利用する、とかです。

置換は、32 K bytes 以内で行う。数メガのファイルが在れば、仮のファイルに
32 K bytes 未満に分割して、処理をループさせると、超、速くなります。

//*1    a1.mac - 文字数をカウントする。
    if( updated ){  endmacro;   }   //  更新済みだと中止 !!!
    if( basename == "" ){   endmacro;   }   //  無題だと中止 !!!
    replaceallfast "[\x20-\xFF]\\f", "\\0", regular;
    #han1 = result;
    gofiletop;
    replaceallfast "[\x81\x40-\xFA\xFF]\\f",  "\\0", regular;
    #zen1 = result;
    $wk1 = "半角文字数 - "+ str(#han1) + "\n全角文字数 - "+ str(#zen1) + "\n";
    message $wk1;
    setclipboard $wk1;
    reopen;
    gofiletop;
endmacro;

[ ]
RE:05712 (全角テキストの文字数)No.05713
番頭++ さん 00/05/09 18:45
 
>    replaceallfast "[\x20-\xFF]\\f", "\\0", regular;

いかんいかん、a1.mac はタブをカウントしていません。
a2.mac の方が速いです。怖い怖い ...

//*1    a2.mac - 文字数をカウントする。
    if( updated ){  endmacro;   }   //  更新済みだと中止 !!!
    if( basename == "" ){   endmacro;   }   //  無題だと中止 !!!
    replaceallfast "[\x09\x20-\xFF]", "", regular;
    #han1 = result;
    replaceallfast "[\x81\x40-\xFA\xFF]",  "", regular;
    #zen1 = result;
    $wk1 = "半角文字数 - "+ str(#han1) + "\n全角文字数 - "+ str(#zen1) + "\n";
    message $wk1;
    setclipboard $wk1;
    reopen;
    gofiletop;
endmacro;

[ ]
RE:05712 (全角テキストの文字数)No.05720
ならい さん 00/05/10 15:43
 
番頭++さん、ありがとうございます。

> 「秀丸エディタ」のマクロを速くするコツは、
> 変数を減らす、while ループを減らす、検索・置換を利用する、とかです。
そうなんですか、φ(..)メモメモ。

>  a2.mac - 文字数をカウントする
> replaceallfast "[\x09\x20-\xFF]", "", regular;
>    #han1 = result
置換した数を数えるとは思いもよりませんでした。

でも、前と同じファイルをカウントしたら、「おそろしい結果」が出てしまいま
した^^;)。
a1.mac    75秒
a2.mac    55秒
きっと、私の環境のせいかもしれません^^;)。

私は、WZを5年ほど前から使ってたんですが、どうも使い勝手が悪いところが
あったり、サポートが悪かったりで、マクロをよく使うようになって最近秀丸に
乗り換えました。秀丸は、マクロが扱いやすく、動作が透明で、カーソルの移動
が早いので、とても気に入っています。
文字数カウントは、1日に1、2回しかしないので、時間に余裕のあるときにカウ
ントすることにします^^;)。

ならい



[ ]
RE:05720 (全角テキストの文字数)No.05721
きいろいまふらあ さん 00/05/10 17:31
 
>でも、前と同じファイルをカウントしたら、「おそろしい結果」が出てしまいま
>した^^;)。

もし、まだご覧になっていなければ、
マクロヘルプのdisabledrawやdisablebreakの項も参考になさってください。
#前者がreplaceallfastに対して効果があるかは知りませんが。

[ ]
RE:05721 (全角テキストの文字数)No.05722
番頭++ さん 00/05/10 18:02
 
想像ですが、改行が少ないデータの場合には、
置換は信じなれないくらいに遅くなります。
そのようなデータの場合には while で code を判定したほうが速いです。

後は、
    while( code != eof ){
        right 250;  insertreturn;
    }
と、文字数のループとの速さの比較で、処理時間が決まります。

//*1    a3.mac - 文字数をカウントする。
    if( updated ){  endmacro;   }   //  更新済みだと中止 !!!
    if( basename == "" ){   endmacro;   }   //  無題だと中止 !!!
    disabledraw;    gofiletop;
    while( code != eof ){
        right 250;  insertreturn;
    }
    replaceallfast "[\x81\x40-\xFA\xFF]",  "", regular; //  全角のほうが多い
 !!!
    #zen1 = result;
    replaceallfast "[\x09\x20-\xFF]", "", regular;
    #han1 = result;
    $wk1 = "全角文字数 - "+ str(#zen1) + "\n半角文字数 - "+ str(#han1) + "\n";
    message $wk1;
    setclipboard $wk1;
    reopen;
    gofiletop;
endmacro;


[ ]
RE:05722 (全角テキストの文字数)No.05725
番頭++ さん 00/05/10 19:58
 
今、テストしたパソコンは K6-2 450 で、メモリは 128 MB です。

    全角文字数  - 49807
    全角空白   - 4298
    半角文字数  - 20734
    半角空白   - 3163
    タブ     - 2580
    改行     - 3279
    合計     - 83861

このようなデータを、replaceallfast で処理すると、
    全角文字数 - 54105
    半角文字数 - 26477
    Lasp Time : 00:00:03
で、while ループで、一文字の code を処理すると、
    全角文字数 - 54105
    半角文字数 - 26477
    Lasp Time : 00:00:15
です。

while( code != eof ){   right 250;  insertreturn;   }
を入れて、replaceallfast で処理すると、
    全角文字数 - 54105
    半角文字数 - 26477
    Lasp Time : 00:00:09

改行が一つも無い、大きなデータでは replaceallfast だけでは、
待てる処理時間ではありませんでした。

pp_kitori1a:
    gofiletop;  #j = 4000;  //  こんなもんかな !!!
    right #j;   insertreturn;
    beginsel;   gofiletop;
    replaceallfast "\\n", "\\n", regular, inselect;
    #i = result;    backspace;    #q = 0;
    if( #i < 5 ){
        gofiletop;
        while( code != eof ){
            right 250;  insertreturn;   #q = #q + 1;
        }
    } else {
    }
    gofiletop;
return;


[ ]
RE:05722 (全角テキストの文字数)No.05727
ならい さん 00/05/11 08:19
 
番頭++さん、こんにちは。

> 想像ですが、改行が少ないデータの場合には、
> 置換は信じなれないくらいに遅くなります。
> そのようなデータの場合には while で code を判定したほうが速いです。
私のサンプルファイルは、改行が468でした。
やはり、番頭++さんのファイルよりかなり少ないので、これが、時間がかかって
いる原因のひとつなんでしょうね。
ちなみに、a3.macは、50秒でした。
私の扱う文書の改行はだいたいそんな比率なので、codeの判定がよいのかもしれ
ません。

いろいろとありがとうございました。

ならい

[ ]
RE:05721 (全角テキストの文字数)No.05728
ならい さん 00/05/11 08:19
 
きいろいまふらあ さん、こんにちは。

> マクロヘルプのdisabledrawやdisablebreakの項も参考になさってください。
"disablebreak"というのは知りませんでした。
今度試してみます。

ありがとうございました。

ならい

[ ]
RE:05727 (全角テキストの文字数)No.05730
番頭++ さん 00/05/11 12:57
 
>ちなみに、a3.macは、50秒でした。

( 25000 + 50000 ) / 468 ==> 約 170 文字に 1 個の改行があるわけですよね。
250 ごとに改行を入れる必要もないみたいだし !!!
あちきのテストでは code をなめるより、a3.mac の処理時間は半分以下です。
改行が一つもない 50000 文字のデータでも、a3.mac の処理時間は半分以下です。

次のようにすると、さらに、処理時間は半分になります。
replaceallfast "[\x81\x40-\xFA\xFF][\x81\x40-\xFA\xFF][\x81\x40-\xFA\xFF][\x
81\x40-\xFA\xFF]",  "", regular;
#zen1 = result*4;
replaceallfast "[\x81\x40-\xFA\xFF]",  "", regular;
#zen1 = #zen1 + result;
replaceallfast "[\x09\x20-\xFF][\x09\x20-\xFF][\x09\x20-\xFF][\x09\x20-\xFF]
", "", regular;
#han1 = result*4;
replaceallfast "[\x09\x20-\xFF]", "", regular;
#han1 = #han1 + result;

「あいまい検索」を指定していますか ???

code の処理時間 12 sec / 2 (半分の意味) ==> 6 sec.
50 sec / 6 sec ==> 約 8 倍.

ならい さんの環境では「秀丸エディタ」の「正規表現」を指定した「置換」の
処理時間が、内の環境の 8 倍もかかって計算になります。
これって気になりません ???

あすから来週の月曜日までアクセスできないので、もし外部に出してもよいデー
タで在れば、LHA とかで圧縮して友達の E-Mail:xxxxxxxx@d4.dion.ne.jp に、
「番頭++ に渡してください。。。。」とかのメールに添付して下さい。友達が
フロッピーで内に届けるはずです。

[ ]
RE:05730 (全角テキストの文字数)No.05731
番頭++ さん 00/05/11 16:01
 
[動作環境] の [自動保存] を [テンポラリ ... ] を指定して、
更新回数が、数十回を指定していませんか ???

そうだとしたら、レジストリを仮に変更して、envchanged; する必要があります。

//  [HKEY_USERS\.Default\Software\Hidemaruo\Hidemaru\Env]
//  "AutoSaveUpdates"=dword:00000000
//  "AutoSaveTime"=dword:00000000
//  "FloppyAutoSave"=dword:00000001
//  "ClearUpdates"=dword:00000001
//  "TempAutoSave"=dword:00000000
    #autosave1 = getininum("hidemaru.ini","Env","AutoSaveUpdates");
    if( #autosave1 ){
        #autosave1_time = getininum("hidemaru.ini","Env","AutoSaveTime");
        #autosave1_flop = getininum("hidemaru.ini","Env","FloppyAutoSave");
        #autosave1_clrup = getininum("hidemaru.ini","Env","ClearUpdates");
        #autosave1_temp = getininum("hidemaru.ini","Env","TempAutoSave");
        writeininum "hidemaru.ini", "Env","AutoSaveUpdates", 0;
        envchanged;
    }
//  message str(#autosave1);
    replaceallfast "[\x81\x40-\xFA\xFF][\x81\x40-\xFA\xFF][\x81\x40-\xFA\xF
F][\x81\x40-\xFA\xFF]",  "", regular;
    #zen1 = result*4;
    replaceallfast "[\x81\x40-\xFA\xFF]",  "", regular;
    #zen1 = #zen1 + result;
    replaceallfast "[\x09\x20-\xFF][\x09\x20-\xFF][\x09\x20-\xFF][\x09\x20-\
xFF]", "", regular;
    #han1 = result*4;
    replaceallfast "[\x09\x20-\xFF]", "", regular;
    #han1 = #han1 + result;
//  レジストリを戻す
    if( #autosave1 ){
        writeininum "hidemaru.ini", "Env", "AutoSaveUpdates", #autosave1;
        writeininum "hidemaru.ini", "Env", "AutoSaveTime", #autosave1_time;
        writeininum "hidemaru.ini", "Env", "FloppyAutoSave", #autosave1_flop;
        writeininum "hidemaru.ini", "Env", "ClearUpdates", #autosave1_clrup;
        writeininum "hidemaru.ini", "Env", "TempAutoSave", #autosave1_temp;
//  ほかにもあるのかな ???
        envchanged;
    }
...

ここまで来ると、あまりお勧めでは在りません。

    #autosave1 = getininum("hidemaru.ini","Env","AutoSaveUpdates");
    if( #autosave1 ){
        message "このマクロは「自動保存」を指定すると動きません !!!";
        endmacro;
    }
これが、普通でしょう ...

[ ]
RE:05731 (全角テキストの文字数)No.05732
番頭++ さん 00/05/11 17:26
 
>ここまで来ると、あまりお勧めでは在りません。

できました !!!

//*5    KZ_Moji_Cnt1.mac - 2000/05/11 - K.Nakatake

//  文字数をカウントするマクロ - 「置換」使用してのカウント
//  更新済みだと中止 !!!
//  無題だと中止 !!!
//  「自動保存」を指定すると中止 !!!
//  - 保存がテンポラリファイルで無いと、元のファイルは壊れます !!!

//  replaceallfast "[\x09\x20-\xFF]", "", regular;  //  Tab.
//  replaceallfast "[\x81\x40-\xFC\xFF]", "", regular;

    if( rightstr(basename,4) == ".mac" ){   endmacro;   }   //  Debug. 1
    if( updated ){
        message "ERROR - 更新中のファイルは処理できません !!!";
        endmacro;
    }
    if( basename == "" ){
        message "ERROR - [無題] のファイルは処理できません !!!";
        endmacro;
    }
    #i = getininum("hidemaru.ini","Env","AutoSaveUpdates");
    if( #i ){
        message "ERROR - このマクロは「自動保存」を指定すると稼動できません
 !!!";
        endmacro;
    }
    gofiletop;
    disabledraw;
    #time_start2 = tickcount;
//* call pp_env_save1;  //  個人のリスクで修正して下さい !!!
    call pp_kitori1;
    $wk1 = "";  #k = 0;
    call pp_sub1 "[\x81\x41-\xFC\xFF]", "全角文字数  - ";
    call pp_sub1 "\x81\x40", "全角空白   - ";
    call pp_sub1 "[\x21-\xFF]", "半角文字数  - ";
    call pp_sub1 "\x20", "半角空白   - ";
    call pp_sub1 "\x09", "タブ     - ";
    gofileend;
    #i = y + 1 - 1; #k = #k + #i;
    $wk1 = $wk1 + "改行     - "+ str(#i-#q) + "\n";
    $wk1 = $wk1 + "\n合計     - "+ str(#k) + "\n";
    call pk_msg_time_lap2 #time_start2;
    $wk1 = $wk1 + "\nLap Time - " + $$return + "\n";
//* call pp_env_restore1;   //  個人のリスクで修正して下さい !!!
    title 0 ;   message $wk1;
    setclipboard $wk1;  //  クリップボードに結果を入れる
    if( basename != "" ){   reopen; }
    gofiletop;  title 0;    //  ???
    setsearch "", 0x00; //  記憶にありません !
endmacro;

pp_sub1:
    if( leftstr($$1,1) == "[" ){
        replaceallfast $$1+$$1+$$1+$$1, "", regular;
        #i = result * 4;
        replaceallfast $$1, "", regular;
        #i = #i + result;
    } else {
        replaceallfast $$1, "";
        #i = result;
    }
    #k = #k + #i;
    $wk1 = $wk1 + $$2 + str(#i) + "\n";
    title $wk1;
return;

pp_kitori1:
    gofiletop;  #j = 5000;  //  こんなもんかな !!!
    right #j;   insertreturn;
    beginsel;   gofiletop;
    replaceallfast "\\n", "\\n", regular, inselect;
    #i = result;    backspace;  #q = 0;
    if( #i < 5 ){
        gofiletop;
        while( code != eof ){
            right 250;  insertreturn;   #q = #q + 1;
        }
    }
    gofiletop;
return;

//  本当は、稼動するけど、
//  データ量が多くなると、超遅くなります !!!
//  [HKEY_USERS\.Default\Software\Hidemaruo\Hidemaru\Env]
//  "AutoSaveUpdates"=dword:00000000
//  "AutoSaveTime"=dword:00000000
//  "FloppyAutoSave"=dword:00000001
//  "ClearUpdates"=dword:00000001
//  "TempAutoSave"=dword:00000000

pp_env_save1:
    #autosave1 = getininum("hidemaru.ini","Env","AutoSaveUpdates");
    if( #autosave1 ){
        #autosave1_time = getininum("hidemaru.ini","Env","AutoSaveTime");
        #autosave1_floppy = getininum("hidemaru.ini","Env","FloppyAutoSave");
        #autosave1_clearup = getininum("hidemaru.ini","Env","ClearUpdates");
        #autosave1_temp = getininum("hidemaru.ini","Env","TempAutoSave");
        writeininum "hidemaru.ini", "Env","AutoSaveUpdates", 0;
        envchanged;
    }
//  message str(#autosave1);
return;

pp_env_restore1:
    if( #autosave1 ){
        writeininum "hidemaru.ini", "Env", "AutoSaveUpdates", #autosave1;
        writeininum "hidemaru.ini", "Env", "AutoSaveTime", #autosave1_time;
        writeininum "hidemaru.ini", "Env", "FloppyAutoSave", #autosave1_floppy;
        writeininum "hidemaru.ini", "Env", "ClearUpdates", #autosave1_clearup;
        writeininum "hidemaru.ini", "Env", "TempAutoSave", #autosave1_temp;
        envchanged;
    }
return;

//*6MICRO   pk_msg_time_lap2
//*6_Desc.  Lap Time    Ver. 03.01
//*6    call pk_msg_time_lap2 arg_n1;
//*6    arg_n1 : start time //  ##1
//*6    $$return : lap time - "hh:mm:ss.nnn"
endmacroall;
pk_msg_time_lap2:
    ##i = tickcount - ##1;
    $$wk1 = "." + rightstr("000"+str(##i%1000),3);  ##i = ##i / 1000;
    while( ##i ){
        $$wk1 = ":" + rightstr("00"+str(##i%60),2) + $$wk1;
        ##i = ##i / 60;
    }
    $$wk1 = rightstr("00:00:00"+$$wk1,12);
return $$wk1;
//*6MICRO_END

//  end of macro.


[ ]
RE:05731 (全角テキストの文字数)No.05733
ならい さん 00/05/11 17:50
 
番頭++さん、分かりました、原因が!!

> [動作環境] の [自動保存] を [テンポラリ ... ] を指定して、
> 更新回数が、数十回を指定していませんか ???
「自動保存」を[ファイルを更新する]を30回にしていたので、これを「しない」
にしたら、すごく早くなりました。
a3.macで10秒、#05727のマクロを入れたら、7秒になりました。
「自動保存」が関係していたとは思いもよりませんでした^^;)。
(実は、そもそも、番頭++さんのマクロをよく理解できていなかったのがいけな
かったりして^^;、マクロ実行後、内容が消えることがあり、なんかおかしいと
は思ったんですが^^;))

でも、
> そうだとしたら、レジストリを仮に変更して、envchanged; する必要がありま
> す。
>
は、せっかくですが、私にはちょっと手が出せないです^^;)。
レジストリはほとんど手をつけたことがないもので、怖くて^^;)。

バックアップは、別のソフトでも行っているので、秀丸のバックアップをオフに
してもいいんですが。環境を練り直してみる必要があるかもしれません。

いろいろとありがとうございました。

[ ]