桁数を統一したいNo.02195
kumagai さん 01/05/23 13:29
 
桁数をそろえたいのですが要求に応えられる
方法が公開されていれば場所をご案内
願います。
簡単なマクロを作成願えればご紹介ください。
---
下記のような「最大8桁の1バイト数字」の行があり
行の最後で改行されています。(規模は一万行程度)
空白の行はありません。
(現状)
1
12
123
1234
12345
123456
1234567
12345678
・・・
・・・
各々の行で1−7桁の数字については頭に0を付加し
8桁の数字についてはそのままにし、8桁に
統一した文字列にしたい。
(期待する結果)
00000001
00000012
00000123
00001234
00012345
00123456
01234567
12345678
・・・
・・・
---


[ ]
RE:02195 桁数を統一したいNo.02196
番頭++ さん 01/05/23 15:13
 
>8桁の数字についてはそのままにし、8桁に

こんな意味ですか ...

//*5    A1.mac
    if( updated ){  endmacro;   } // 更新中はダメ。
    replaceallfast "^[0-9]+\\f", "00000000\\0", regular, ask;
    replaceallfast "^[0-9]+\\f........", "\\1", regular, ask;
endmacro;

ファイルの最後は改行で終わって下され。

[ ]
RE:02196 桁数を統一したいNo.02197
山紫水明 さん 01/05/23 16:14
 
 kumagaiさん,番頭++さん,こんにちは。

》    if( updated ){  endmacro;   } // 更新中はダメ。
》    replaceallfast "^[0-9]+\\f", "00000000\\0", regular, ask;
》    replaceallfast "^[0-9]+\\f........", "\\1", regular, ask;

 おもしろい置換の使い方ですね。ただ,1万行ほどあるそうですから,全部問い
合わせていたら2万回にも・・・
 ご希望の趣旨からみて,ask はとった方がいいのではと思いますが。
 次のような方法もありますね。
 開始点にカーソルを置いてやってください。スピードの点ではどちらかな?

//-------------------------------------------//
disabledraw;
while(code != eof) {
    insert leftstr( "00000000", 8 - linelen );
    moveto 0, y + 1;
}
endmacro;
//-------------------------------------------//

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

[ ]
RE:02197 桁数を統一したいNo.02198
kumagai さん 01/05/23 16:55
 
> kumagaiさん,番頭++さん,こんにちは。

                                        山紫水明

山紫水明さん、番頭++さん、いつも早急なご対応に感謝です。
また頼ってしまいました。自分の非力さを痛感!
目的の処理は無事完了しました。ありがとうございました。

[ ]
RE:02197 その対象となるサイズ、行数で、No.02199
番頭++ さん 01/05/23 18:21
 
ask, はガードのためです。「一気」があります。
「キャンセル」で複数の置換処理のフェーズが設定可能かも。
この場合には、単に、二行目はそのコピーです。手抜きでもないのですが。

「秀丸」のマクロの速さとか、考えると、置換のほうが一般的には早いです。
行の処理、変数処理は遅いです。ただ置換は、その対象となるサイズ、行数で、
著しく著しく遅くなります。「秀丸」の仕様です。ある程度のサイズで、
ステルスに Cut & Paste して、置換をする例を以前に示しました。
まるで速さが変わります。それと不安定になることになります。

平均 1-8 ので、 5 bytes * 10,000 ==> 50 K だと、
1/2, 1/3 ずつの置換処理かも。ここは手抜きです。でした。
速さを問うなら、全体を見ますでしょう。
でもその処理時間が長いかも。

ここまで、ヨミマシタか ???
この件はおしまい。。。

[ ]
RE:02199 その対象となるサイズ、行数で、No.02214
番頭++ さん 01/05/25 08:50
 
>この件はおしまい。。。

テストの条件:
==============

「秀丸エディタ」の自動保存は行っていない。
\temp に、元データはない。
ネットワーク定義はありますが、ログインはしていない。
ウイルス関連ソフトは止めている。

Test Data は次の文字列 (改行) の繰り返しです。

1
12
123
1234
12345
123456
1234567


テストの結果:
==============

・ K6-2-450 128 MB - A0.mac Base - 0.76 sec.

Line    size (KB)    A1.mac   A2.mac (sec.)
======  =========    ======   ======
  1250        7.5       1.4      1.0
  2500         15       2.7      2.9
  5000         30       5.4      9.6
 10000         60      10.7     20.3
 20000        120      20.1     39.1
 40000        240      41.3   2:04    **1
 80000        480    1:25        ---

・ K7-800   256 MB - A0.mac Base - 0.36 sec.

Line    size (KB)    A1.mac   A2.mac (sec.)
======  =========    ======   ======
  1250        7.5      0.46     0.26
  2500         15      0.91     0.67
  5000         30       1.8      2.0
 10000         60       3.6      4.1
 20000        120       7.1      7.4
 40000        240      14.1     21.3  **2
 80000        480      28.1   1:27    **2
160000        960      55.9      ---  **2

この計測は一度だけなので +- 5 % とか の誤差はあるかも。10 % かも。


考察:
======

... は、しません ...
一年前に同じような事を書いています。少しイミが違いますが。


使用したマクロ:
========================================================================

//*5    A1.mac
    if( rightstr(basename,4) == ".mac" ){   endmacro;   }
    if( updated ){  endmacro;   } // 更新中はダメ。
    disabledraw;
    #time_start2 = tickcount;
    replaceallfast "^[0-9]+\\f", "00000000\\0", regular;
    replaceallfast "^[0-9]+\\f........", "\\1", regular;
    gofiletop;
    call pk_msg_time_lap2 #time_start2;
    message "Lap Time : " + $$return;
endmacro;

//*5    A2.mac
    if( rightstr(basename,4) == ".mac" ){   endmacro;   }
    if( updated ){  endmacro;   } // 更新中はダメ。
    disabledraw;
    #time_start2 = tickcount;
while(code != eof) {
    insert leftstr( "00000000", 8 - linelen );
    moveto 0, y + 1;
}
    call pk_msg_time_lap2 #time_start2;
    message "Lap Time : " + $$return;
endmacro;


//*5    A0.mac
    #time_start2 = tickcount;
    #i = 50000;
    while( #i ){    #i = #i - 1;    }
    call pk_msg_time_lap2 #time_start2;
    message "Lap Time : " + $$return;
endmacro;


//*6MICRO   pk_msg_time_lap2
//*6_Desc.  Lap Time    Ver. 03.01B
//*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;
pk_msg_time_lap2A:
##i = tickcount - ##1;
$$wk1 = "." + rightstr("000"+str(##i%1000),3);  ##i = ##i / 1000;
$$wk1 = ":" + rightstr("00"+str(##i%60),2) + $$wk1; ##i = ##i / 60;
$$wk1 = ":" + rightstr("00"+str(##i%60),2) + $$wk1; ##i = ##i / 60;
$$wk1 = ""  + rightstr("00"+str(##i%60),2) + $$wk1;
return $$wk1;
//*6MICRO_END

========================================================================


[ ]
RE:02214 その対象となるサイズ、行数で、No.02216
ENCODINGSHIFTJIS さん 01/05/25 16:58
 
>>この件はおしまい。。。

追試しました、マクロの配列と同様に行数に比例して、
行移動の単位時間が伸びます。
 行も配列の機構なんでしょうか?
 300KBでもディスクのアクセスは無いようだから、
I/Oのパターンではないようです。
1万行処理の千行毎の時間は少しずつ短くなるが

moveto 0,y+1; //ランダムアクセス
golineend2;right;//相対移動

どちらでも傾向は同じです。巨大テキストのマクロ処理は O(2) か ガックリ



[ ]
RE:02216 その対象となるサイズ、行数で、No.02221
番頭++ さん 01/05/25 21:02
 
「秀丸」の行は、それなりのインデックス処理なので、速いです。
問題は、インタプリタの命令を取出しに要する時間かも。

置換は jre32.dll を呼ぶので、まずハードのキャッシュは期待できない、
でも、マクロのロジックがキャッシュにはまっている、根拠もないです。
アセンブラでもないし ...

理論としての、マクロの速さはわからんです。そうなんです。
結果として、そうなんです ...

[ ]
RE:02214 その対象となるサイズ、行数で、No.02222
山紫水明 さん 01/05/25 21:35
 
 番頭++さん,こんばんは。

 追試してみました。

テストの結果:
==============

・ Pentium 233MHZ  96 MB - A0.mac Base - 2.44 sec.

Line    size (KB)    A1.mac   A2.mac (sec.)
======  =========    ======   ======
  1250        7.5       3.6      1.3
  2500         15       6.7      4.4
  5000         30      13.6     13.6
 10000         60      25.9     23.2
 20000        120      51.9     58.0
 40000        240    1:43.6   3:01.0

》この計測は一度だけなので +- 5 % とか の誤差はあるかも。10 % かも。
 同じくです。

 マシンの違いは歴然! こちらではマクロの差がはっきりするのは1万行を越え
てからのようです。

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

[ ]
RE:02221 その対象となるサイズ、行数で、No.02233
encodingshiftjis さん 01/05/27 15:54
 
>理論としての、マクロの速さはわからんです。そうなんです。
>結果として、そうなんです ...

幾分かはクリアーな結果が出ました。

// 行移動の単位時間 は? 変化点は 連続千行毎の時間は?
// 連続の変動アクセス?
// 行番号が大きいと遅いアクセスと言えるか?●●●これかも
// 作業領域をテキスト末尾には不利か?
// 巨大データ処理の目安として単位時間は,
// [異なり行数]に比例する時間がかかるようになる,だいたい
// マクロの配列変数も同様か?

// UNITtime.mac

disabledraw;
selectall;delete;insertline;
#j=16;while(#j>0){#j=#j-1;selectall;copy;paste;} //行設定

      #j=4;
while(#j>0){
      #d=30;
while(#d>0){ #dd=1000; #ddd=#d*1000;
#t=tickcount;
while(#dd>0){ moveto 0,#ddd+#dd; #dd=#dd-1;}// #ddd-#dd でも変わらず
#tt[#d]=tickcount-#t;
    #d=#d-1;
}
gofiletop;
      insert str(#j);insertreturn;
      #d=30;
while(#d>0){ insert str(#tt[#d])+","+str(#d);insertreturn;
      #d=#d-1;
}
insertreturn;
// もう一度
#j=#j-1;
}
// 末尾行アクセスの繰り返しは ?
#j=15;
while(#j>0){#j=#j-1;
#t=tickcount;
      #ddd=30000;
while(#ddd>29000){#ddd=#ddd-1;moveto 0,#ddd;}
gofiletop;insert str(tickcount-#t);insertreturn;
}
gofiletop;insertline;

// 先頭行アクセスの繰り返しは ?
#j=15;
while(#j>0){#j=#j-1;
#t=tickcount;
      #ddd=1000;
while(#ddd> 000){#ddd=#ddd-1;moveto 0,#ddd;}
gofiletop;insert str(tickcount-#t);insertreturn;
}
endmacro

[ ]