マクロの実行速度を向上させたいNo.06808
yamasan さん 12/01/16 13:26
 
こんにちは。よろしくお願いします。

 06140 カンマ区切りと、改行を入れたい。 / yamasan [ 09/04/27 17:08 ]
http://www.maruo.co.jp/hidesoft/4/x06140_.html#6140
で、お教え頂いたマクロについてです。
スイマセン。

一件辺り448byteのデータがあって、
カンマ区切り、タブ区切りで一件の最後に改行が入ったものにしたいという希望です。
通常は、一ファイル(ファイル内改行なし)でデータ100〜200件でした。

例を申しますと、
190件のデータファイル(85,120 byte)ですと、下に記したマクロで、
1分30秒かかっています。
この位の容量までなら、許容範囲ですけれども、

950件分(425,600 byte)をやってみましたところ、
マクロ実行後、一件辺り15秒かかってしまいまして、
あまりに、時間が掛かるので、マクロ中止にしました。

動作環境->パフォーマンスで、メモリを1,280MBにしてみましたが、
同じ速度でした。どうにかして、動作速度を向上させたいのですが、
お教えくださいませんでしょうか?


//カンマ区切りマクロ

setcompatiblemode 15;
 gofiletop;
 while ( 1 ) {
movetolineno column + 1 + 8, lineno;
 insert ",";
movetolineno column + 1 + 1, lineno;
 insert ",";
movetolineno column + 1 + 2, lineno;
 insert ",";
movetolineno column + 1 + 8, lineno;
 insert ",";
movetolineno column + 1 + 32, lineno;
 insert ",";
movetolineno column + 1 + 16, lineno;
 insert ",";
movetolineno column + 1 + 68, lineno;
 insert ",";
movetolineno column + 1 + 68, lineno;
 insert ",";
movetolineno column + 1 + 1, lineno;
 insert ",";
movetolineno column + 1 + 20, lineno;
 insert ",";
movetolineno column + 1 + 40, lineno;
 insert ",";
movetolineno column + 1 + 20, lineno;
 insert ",";
movetolineno column + 1 + 40, lineno;
 insert ",";
movetolineno column + 1 + 7, lineno;
 insert ",";
movetolineno column + 1 + 6, lineno;
 insert ",";
movetolineno column + 1 + 6, lineno;
 insert ",";
movetolineno column + 1 + 3, lineno;
 insert ",";
movetolineno column + 1 + 1, lineno;
 insert ",";
movetolineno column + 1 + 10, lineno;
 insert ",";
movetolineno column + 1 + 10, lineno;
 insert ",";
movetolineno column + 1 + 10, lineno;
 insert ",";
movetolineno column + 1 + 10, lineno;
 insert ",";
movetolineno column + 1 + 6, lineno;
 insert ",";
movetolineno column + 1 + 8, lineno;
 insert ",";
movetolineno column + 1 + 1, lineno;
 insert ",";
movetolineno column + 1 + 1, lineno;
 insert ",";
movetolineno column + 1 + 6, lineno;
 insert ",";
movetolineno column + 1 + 1, lineno;
 insert ",";
movetolineno column + 1 + 38, lineno;
  insert "\n";
  if ( code == eof ) break;
 }

[ ]
RE:06808 マクロの実行速度を向上させたいNo.06809
秀まるお2 さん 12/01/16 14:36
 
 秀丸エディタは1行の長さが極端に長いと全体的に動作が重くなる傾向があり
ます。なので、まずは1行になってしまってるデータを複数行に分ける所から先
にやった方がいいと思います。

 具体的にどうしたらいいかですが…

 まずは、改行で区切る処理自体は、全置換でやるのがいいと思います。

 全置換でやるとしたら、例えば半角文字が400文字毎で1つ改行を入れるなら、

検索:               ((.){400})
置換:               \1\n
大文字/小文字の区別:ON
正規表現:            ON

 で全置換すればいいです。全置換中に出てくる「スピードアップ」のボタンを
押せば、たぶん何分もかからずに置換すると思います。
 (こちらでテストした限りでは10キロバイトデータを400バイト単位に区切
るのでも一瞬で終わりました)

 で、それがうまくいったら、後はこれとは別にinsert ","をループさせるマク
ロを作ってそれで置換したらいいかと思いますが、実はこれも正規表現を使った
全置換の方が簡単に出来ます。

 例えば、半角10文字の、半角20文字、半角30文字の所にコンマを入れるなら、

検索:               ^((.){10})((.){20})((.){30})
置換:               \1,\2,\3,
大文字/小文字の区別:ON
正規表現:            ON

 みたいな置換で出来ます。

 こんな感じで正規表現パターンを作れば、ほぼ一瞬で置換すると思います。

 ちなみに、正規表現での「.」は、全角文字でも半角文字でも同じ「1文字」と
カウントするので、それのつもりで文字数({}の中の数字)を指定すればいいで
す。moveto等では「半角は1文字、全角は2文字相当」で座標を指定するので、そ
れと違う点だけ気をつければいいです。

 具体的なデータ(変換前および変換後のデータ)の例を教えていただければこ
ちらでもっと具体的な正規表現パターンの例を作って差し上げることも出来るか
と思います。
 (内容がバレてしまって差し支え無ければなので、ある程度偽装して書き込ん
でいただいてもいいですが、その時は全角文字と半角文字の区別は正確に書いて
いただく必要があります)

[ ]
RE:06809 マクロの実行速度を向上させたいNo.06810
yamasan さん 12/01/16 16:38
 
秀まるお2 さん、初めまして。お世話になります。
よろしくお願いします。

データを説明するのが、私にとっては難しいので、
長くなりますが、スイマセン。全角が混ざっているので、
検索:((.){448})
として、置換すると、上手く行きません。スイマセン。


一件分のデータが、

000001160010139001219290146                        73              全角文字
あり全角文字                                                                
                                                    1セイセイ メイ             姓
姓 名名名                            セイセイ メイ             姓姓 名名名      
                      00029300002930026370010                              
         201112193902161220120119                                    


の様なもので、以下の様に、変換したいです。


00000116,0,01,01390012,19290146                        ,73              ,全
角文字あり全角文字                                                ,        
                                                           ,1,セイセイ メイ      
      ,姓姓 名名名                            ,セイセイ メイ             ,姓姓 
名名名                            ,0002930,000293,002637,001,0,          ,  
        ,          ,          ,201112,19390216,1,2,201201,1,9              
                     



データの説明をカンマ区切りで書きますと、
以下の様な29項目が、一件(448byte)になっています。


項目の形式
a…数値記録すべきデーターが無い場合は0を埋めています
x…半角文字
n…全角文字半角文字との混在
※xおよびn共に、記録すべきデーターが項目長に満たない場合、
左詰めにし余白はスペースで埋めてあります


No,項目の形式,桁,バイト
1,a,8,8
2,a,1,1
3,a,2,2
4,a,8,8
5,n,16,32
6,n,8,16
7,n,34,68
8,n,34,68
9,a,1,1
10,x,20,20
11,n,20,40
12,x,20,20
13,n,20,40
14,a,7,7
15,a,6,6
16,a,6,6
17,a,3,3
18,a,1,1
19,x,10,10
20,x,10,10
21,x,10,10
22,x,10,10
23,a,6,6
24,a,8,8
25,a,1,1
26,a,1,1
27,a,6,6
28,a,1,1
29,x,38,38


マクロもあまり詳しくないので、申し訳ないですが、
お教えくださいませんでしょうか?どうかよろしくお願いします。

[ ]
RE:06810 マクロの実行速度を向上させたいNo.06811
秀まるお2 さん 12/01/16 17:38
 
 そのデータだと、名前の部分に含まれる全角文字の個数が不定なので、単純に

    ((.){400})

 のようなパターンでは置換出来ないです。

 「先頭に27桁の数字があって、一番最後が24桁の数字+37個の半角空白になっ
てる」ってルールを使って置換すればいいかと思います。具体的には、

検索:  (\d{27}.*?\d{24} {37})
置換:  \1\n

 で置換出来ると思います。

 それで置換したら、今度は…

 今度の置換はすみませんが正規表現パターンが長すぎて作るのが難しいので、
マクロでやって欲しいです。マクロは、

setcompatiblemode 15;
disabledraw;
 gofiletop;
 while ( 1 ) {
    movetolineno column + 1 + 8, lineno;
     insert ",";
    movetolineno column + 1 + 1, lineno;
     insert ",";
    movetolineno column + 1 + 2, lineno;
     insert ",";
    movetolineno column + 1 + 8, lineno;
     insert ",";
    movetolineno column + 1 + 32, lineno;
     insert ",";
    movetolineno column + 1 + 16, lineno;
     insert ",";
    movetolineno column + 1 + 68, lineno;
     insert ",";
    movetolineno column + 1 + 68, lineno;
     insert ",";
    movetolineno column + 1 + 1, lineno;
     insert ",";
    movetolineno column + 1 + 20, lineno;
     insert ",";
    movetolineno column + 1 + 40, lineno;
     insert ",";
    movetolineno column + 1 + 20, lineno;
     insert ",";
    movetolineno column + 1 + 40, lineno;
     insert ",";
    movetolineno column + 1 + 7, lineno;
     insert ",";
    movetolineno column + 1 + 6, lineno;
     insert ",";
    movetolineno column + 1 + 6, lineno;
     insert ",";
    movetolineno column + 1 + 3, lineno;
     insert ",";
    movetolineno column + 1 + 1, lineno;
     insert ",";
    movetolineno column + 1 + 10, lineno;
     insert ",";
    movetolineno column + 1 + 10, lineno;
     insert ",";
    movetolineno column + 1 + 10, lineno;
     insert ",";
    movetolineno column + 1 + 10, lineno;
     insert ",";
    movetolineno column + 1 + 6, lineno;
     insert ",";
    movetolineno column + 1 + 8, lineno;
     insert ",";
    movetolineno column + 1 + 1, lineno;
     insert ",";
    movetolineno column + 1 + 1, lineno;
     insert ",";
    movetolineno column + 1 + 6, lineno;
     insert ",";
    movetolineno column + 1 + 1, lineno;
     insert ",";
    movetolineno column + 1 + 38, lineno;
    down;
    if( !result ) break;
    if( code == eof ) break;
    golinetop2;
 }

 でいけると思います。「表示・折り返し・最大」を実行して折り返し桁数を最
大にした状態でマクロ実行すれば、そんなに時間はかからずに終わると思います。

 それでどうでしょ?

[ ]
RE:06811 マクロの実行速度を向上させたいNo.06812
yamasan さん 12/01/16 18:28
 
秀まるお2 さん、お教え頂きありがとうございました。
無事、解決出来ました〜!

> 「先頭に27桁の数字があって、一番最後が24桁の数字+37個の半角空白になっ
>てる」ってルールを使って置換すればいいかと思います。具体的には、

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

>検索:  (\d{27}.*?\d{24} {37})
>置換:  \1\n


データ例の説明が十分でなかったためなのですが、実際は、
 「先頭に19桁の数字があって・・・」と、解釈して、

(\d{19}.*?\d{24} {37})
として、検索することで、改行を間違いなく入れることが出来ました。



> それで置換したら、今度は…
>
> 今度の置換はすみませんが正規表現パターンが長すぎて作るのが難しいので、
>マクロでやって欲しいです。マクロは、


お教えのマクロで実行したところ、希望が実現しました。助かりました。

950件分のデータ(425,600バイト)を正規表現で置換するのに、約15秒。
お教えくださいましたマクロでカンマ区切りにするのに、僅か、20秒ほどでした。
置換やマクロ実行中、固まったように見えて少々不安でしたが、それはそれです。ス
イマセン。
因みに、私の環境は、Core i7 860、メモリ8GB、Windows 7 x64、秀丸エディタ64 ve
r.8.10でした。

> 秀丸エディタは1行の長さが極端に長いと全体的に動作が重くなる傾向があり
> ます。

これは、知らなかったので、勉強になりました。
この度は、大変お世話になり、ありがとうございました。本当に助かりました。
御礼を申し上げます。感謝申し上げます。<(_ _)>

[ ]
RE:06812 マクロを一つに纏めたいですNo.06821
yamasan さん 12/01/18 09:23
 
こんにちは。
先日は、秀まるお2 様に、ご指導いただきました。
ありがとうございました。

お教え頂いたマクロですが、
置換を含めた一つのマクロにしたいと思います。

ファイル内に改行はない筈ですが、
前処理として、念のために、改行(\n)を取り除く箇所を作りました。
以下の様な記述で、いいのでしょうか?
マクロについては、未だ未だ、分かっていないので、
不必要な箇所なども分かりません。
ご指導を賜りますようお願い申し上げます。


setcompatiblemode 15;
   gofiletop;
   begingroupundo;
   replaceall "\\n" , "" , regular, nohilight;
   if( ! result )  beep;
   gofiletop;
   replaceallfast "(\\d{19}.*?\\d{24} {37})" , "\\1\\n" , regular, nohilight;
   if( ! result )  beep;
   endgroupundo 1;
 disabledraw;
  gofiletop;
  while ( 1 ) {
     movetolineno column + 1 + 8, lineno;
      insert "\t";
     movetolineno column + 1 + 1, lineno;
      insert "\t";
     movetolineno column + 1 + 2, lineno;
      insert "\t";
・・・中略・・・
     movetolineno column + 1 + 38, lineno;
     down;
     if( !result ) break;
     if( code == eof ) break;
     golinetop2;
  }

[ ]
RE:06821 マクロを一つに纏めたいですNo.06822
秀まるお2 さん 12/01/18 09:52
 
 見た感じ、それで大丈夫だと思います。

[ ]
RE:06822 ありがとうございました。No.06823
yamasan さん 12/01/18 10:10
 
お世話になっております。ありがとうございます。

> 見た感じ、それで大丈夫だと思います。

そう仰って頂ければ、得心出来ました。
助かりました。お手数をおかけしました。
今後ともよろしくお願い申し上げます。

[ ]