マクロの件No.00534
kobo さん 99/05/04 19:59
 
はじめまして。
秀丸を愛用しているもですが、次のような処理をおこなうのにどうしたら良いのでし
ょうか。
ご多忙のところ恐縮ですがよろしくお願い致します。
  
     高野耕二
     214-0006 神奈川県川崎市多摩区菅仙谷 3-1,16-501
     xxxxxx@kw.netlaputa.ne.jp

テキストファイル

3X0NU
F6FNU
UPDbyOZ7Capr96
&&
4U1ITU
JA1VNA
UPDbyOZ7Capr96
&&



上記ならびで縦方向に80万行あり、各行の内容は異なります。4行分が1組になっ
ています。

  
以上の1組4行を、次のような1列のCSV形式にしたいのです。UPDbyOZ7Capr96(各行
で異なる)と&&(全て共通)は削除する。

3X0NU,F6FNU
4U1ITU,JA1VNA


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




[ ]
RE:00534 マクロの件No.00536
杉浦 まさき さん 99/05/05 03:11
 
kobo さん、はじめまして。
杉浦 まさき と申します。

>秀丸を愛用しているもですが、次のような処理をおこなうのにどうしたら良いのでし
>ょうか。

うーん、あくまでも秀丸マクロだけで処理させようとすれば
以下のようなものになると思います。
#念のため(^^;基本的なことを書いときますが…
 以下の内容のファイルを秀丸(マクロ)フォルダに作成して
 (拡張子は .mac にして)、それを「マクロ」->「マクロ実行」で
 選んで実行して下さい。

//---------------
disabledraw;
gofiletop;
while (code != -1) {
    golineend2; // 行末へ移動
    insert ","; // カンマの挿入
    delete;     // 改行を削除(次の行を連結)
    golinetop2; // 行先頭へ移動
    down;       // 次の行へ移動
    beginsel;   // 範囲選択開始
    down 2;     // 2行下へ移動
    delete;     // 選択範囲を削除
    escape;     // 念のため(^^;
}
endmacro;
//---------------

ただ、80万行もあるファイルの処理にかかる時間を考えると…
sed やら awk やら perl といったツールの方がより効率的です。
#これらのツールはベクターのWebページ他に転がってます。

一応 awk(gawk でテスト済み) のコードをアップしときますね。
#この場合は sed が一番効率よさそうだけど…
 sed スクリプトは自信ないです(^^;。

#----------------
BEGIN {
    FS = "";
}

{
    if (NR%4 == 1) printf($0); # 最初の行は改行せずにそのまま出力
    else if (NR%4 == 2) print "," $0; # カンマに続けて次を出力
    else if (NR%4 == 0 && length($0) != 2) {
        # 4行目が明らかに "&&" ではない!
        # (厳密に比較を行うと速度がでなさそうなので最小限)
        print "Data Error!!" > "/dev/stderr";
        exit;
    }
}
#----------------

#あとどうでもいいんですが…こういう公共の場所に
 どうどうと住所を書き込むのは得策ではないと思いますけど(^^;。


[ ]
RE:00536 マクロの件No.00538
番頭++ さん 99/05/06 12:50
 
これって、replace でいけませんか、

gofiletop;
$wk1 = time;
// searchdown ".*\\f\\n\\f.*\\f\\n.*\\n.*&&\\n", regular;
// replacedown ".*\\f\\n\\f.*\\f\\n.*\\n.*&&\\n", "\\0,\\2\\n", regular;
replaceallfast ".*\\f\\n\\f.*\\f\\n.*\\n.*&&\\n", "\\0,\\2\\n", regular;
message str(result) + " 件を処理しました。\n\n" + $wk1 + "\n" + time;
endmacro;

K6-233 (Pentium 233) クラスで、4 万行で、1 分 40 - 42 秒程度なので、
80 万行は、最低でも 33.5 - 34 分はかかるでしょう ...
ちなみに、「ウイルスバスター」はとめました。

80 万行に耐えるのかはテストしていませんが ...

[ ]
RE:00538 マクロの件No.00539
番頭++ さん 99/05/06 16:51
 
>これって、replace でいけませんか、

「秀丸」の置換は 32 K Bytes を超えると非常に遅くなりますので、
先ほどのマクロでは、行が増えるごとに、シンドクなります。

このマクロだと、 32 K Bytes 以内で置換を行うので、
K6-233 (Pentium 233) クラスで、4 万行で、1 分 10 - 12 秒程度なので、
80 万行は、23.5 - 24.5 分で済む、はずです ...

//*2    a2.mac
    if( version < 300 ){    endmacro;   }   //  Version 3.0x 以上 - replace \f
    if( hidemarucount != 1 ){   endmacro;   }   //  ファイルはひとつだけ開く !
    gofileend;
    if( x != 0 ){   insertreturn;   }   //  最終行は改行だけ !
    gofiletop;  //  ファイルの先頭から ...
    $wt1 = time;
    openfile "/h temp1.txt";    //  作業用のファイル
    selectall;  delete;
    setactivehidemaru 1;
    disabledraw;
//R showwindow 0;
    while( code != eof ){
        beginsel;   down 2000;  //  2000 行ごとの処理
        cut;
        setactivehidemaru 1;
        paste;  gofiletop;
        replaceallfast  ".*\\f\\n\\f.*\\f\\n.*\\n.*&&\\n", "\\0,\\2\\n", regular;
        #k = #k + result;
        selectall;  cut;
        setactivehidemaru 1;
        disabledraw;
        paste;
        title str(#k) + " 件を処理。: " + $wt1 + " - " + time;
    }
    message str(#k) + " 件を処理しました。\n\n" + $wt1 + "\n" + time;
    setactivehidemaru 1;    quit;   //  作業用のファイル
endmacro;

「ウイルスバスター」等はとめたほうが 25 - 40 % 速くなると思います。
[動作環境] - [テンポラリファイル] を [メモリ] にするのも効果があるはずです。

これ以上は、改造しても、効果は少ないです。と思います ...

[ ]
RE:00536 マクロの件No.00540
kobo さん 99/05/06 18:19
 
杉浦まさき さん

ご多忙のおりご回答くださり大変感謝致します。
お蔭様でうまく処理できました。時間はかなりかかります。1晩で8万行
処理でき、10日あれば完了できそうです。
秀丸といえば普通のテキスト入力しかやっていませんでしたが、こんな使い方
があると見なおしています。
今後ともよろしくお願い致します。


kobo さん、はじめまして。
>杉浦 まさき と申します。
>
>>秀丸を愛用しているもですが、次のような処理をおこなうのにどうしたら良いのでし
>>ょうか。
>
>うーん、あくまでも秀丸マクロだけで処理させようとすれば
>以下のようなものになると思います。
>#念のため(^^;基本的なことを書いときますが…
> 以下の内容のファイルを秀丸(マクロ)フォルダに作成して
> (拡張子は .mac にして)、それを「マクロ」->「マクロ実行」で
> 選んで実行して下さい。
>
>//---------------
>disabledraw;
>gofiletop;
>while (code != -1) {
>    golineend2; // 行末へ移動
>    insert ","; // カンマの挿入
>    delete;     // 改行を削除(次の行を連結)
>    golinetop2; // 行先頭へ移動
>    down;       // 次の行へ移動
>    beginsel;   // 範囲選択開始
>    down 2;     // 2行下へ移動
>    delete;     // 選択範囲を削除
>    escape;     // 念のため(^^;
>}
>endmacro;
>//---------------
>
>ただ、80万行もあるファイルの処理にかかる時間を考えると…
>sed やら awk やら perl といったツールの方がより効率的です。
>#これらのツールはベクターのWebページ他に転がってます。
>
>一応 awk(gawk でテスト済み) のコードをアップしときますね。
>#この場合は sed が一番効率よさそうだけど…
> sed スクリプトは自信ないです(^^;。
>
>#----------------
>BEGIN {
>    FS = "";
>}
>
>{
>    if (NR%4 == 1) printf($0); # 最初の行は改行せずにそのまま出力
>    else if (NR%4 == 2) print "," $0; # カンマに続けて次を出力
>    else if (NR%4 == 0 && length($0) != 2) {
>        # 4行目が明らかに "&&" ではない!
>        # (厳密に比較を行うと速度がでなさそうなので最小限)
>        print "Data Error!!" > "/dev/stderr";
>        exit;
>    }
>}
>#----------------
>
>#あとどうでもいいんですが…こういう公共の場所に
> どうどうと住所を書き込むのは得策ではないと思いますけど(^^;。
>

[ ]
RE:00539 マクロの件No.00541
kobo さん 99/05/06 20:34
 
番頭さんへ

はじめまして。

ご指導いただきました方法で実行させたところ、驚くべき速度で処理をおこなうこと
ができました。

元ファイルは、847,707行 8,293,544バイト

時間は、43分14秒 でした。

私にとって、はじめてマクロ処理であり、秀丸の素晴らしさをあらためて痛感させら
れた出来事でした。

大変ありがとうございました。秀丸に精通された方とお見受けされますが、お仕事で
よくお使いなのでしょうか。

今後ともよろしくお願い致します。


>//*2    a2.mac
>    if( version < 300 ){    endmacro;   }   //  Version 3.0x 以上 - replace
 \f
>    if( hidemarucount != 1 ){   endmacro;   }   //  ファイルはひとつだけ開
く !
>    gofileend;
>    if( x != 0 ){   insertreturn;   }   //  最終行は改行だけ !
>    gofiletop;  //  ファイルの先頭から ...
>    $wt1 = time;
>    openfile "/h temp1.txt";    //  作業用のファイル
>    selectall;  delete;
>    setactivehidemaru 1;
>    disabledraw;
>//R showwindow 0;
>    while( code != eof ){
>        beginsel;   down 2000;  //  2000 行ごとの処理
>        cut;
>        setactivehidemaru 1;
>        paste;  gofiletop;
>        replaceallfast  ".*\\f\\n\\f.*\\f\\n.*\\n.*&&\\n", "\\0,\\2\\n", re
gular;
>        #k = #k + result;
>        selectall;  cut;
>        setactivehidemaru 1;
>        disabledraw;
>        paste;
>        title str(#k) + " 件を処理。: " + $wt1 + " - " + time;
>    }
>    message str(#k) + " 件を処理しました。\n\n" + $wt1 + "\n" + time;
>    setactivehidemaru 1;    quit;   //  作業用のファイル
>endmacro;
>
>「ウイルスバスター」等はとめたほうが 25 - 40 % 速くなると思います。
>[動作環境] - [テンポラリファイル] を [メモリ] にするのも効果があるはずです。
>
>これ以上は、改造しても、効果は少ないです。と思います ...



>>これって、replace でいけませんか、
>
>「秀丸」の置換は 32 K Bytes を超えると非常に遅くなりますので、
>先ほどのマクロでは、行が増えるごとに、シンドクなります。
>
>このマクロだと、 32 K Bytes 以内で置換を行うので、
>K6-233 (Pentium 233) クラスで、4 万行で、1 分 10 - 12 秒程度なので、
>80 万行は、23.5 - 24.5 分で済む、はずです ...
>
>//*2    a2.mac
>    if( version < 300 ){    endmacro;   }   //  Version 3.0x 以上 - replace
 \f
>    if( hidemarucount != 1 ){   endmacro;   }   //  ファイルはひとつだけ開
く !
>    gofileend;
>    if( x != 0 ){   insertreturn;   }   //  最終行は改行だけ !
>    gofiletop;  //  ファイルの先頭から ...
>    $wt1 = time;
>    openfile "/h temp1.txt";    //  作業用のファイル
>    selectall;  delete;
>    setactivehidemaru 1;
>    disabledraw;
>//R showwindow 0;
>    while( code != eof ){
>        beginsel;   down 2000;  //  2000 行ごとの処理
>        cut;
>        setactivehidemaru 1;
>        paste;  gofiletop;
>        replaceallfast  ".*\\f\\n\\f.*\\f\\n.*\\n.*&&\\n", "\\0,\\2\\n", re
gular;
>        #k = #k + result;
>        selectall;  cut;
>        setactivehidemaru 1;
>        disabledraw;
>        paste;
>        title str(#k) + " 件を処理。: " + $wt1 + " - " + time;
>    }
>    message str(#k) + " 件を処理しました。\n\n" + $wt1 + "\n" + time;
>    setactivehidemaru 1;    quit;   //  作業用のファイル
>endmacro;
>
>「ウイルスバスター」等はとめたほうが 25 - 40 % 速くなると思います。
>[動作環境] - [テンポラリファイル] を [メモリ] にするのも効果があるはずです。
>
>これ以上は、改造しても、効果は少ないです。と思います ...

[ ]
RE:00541 マクロの件No.00542
杉浦 まさき さん 99/05/07 01:34
 
kobo さん、番頭++ さん、こんばんは。
杉浦 まさき です。

>時間は、43分14秒 でした。

がーん!速いですね…こりゃまいりました(^^;。

#ちなみに、最初の発言の例(8行分のデータ)を10万個分
 コピーしたファイル(6.2MB)を AWK で処理してみた所、
 所用時間は15秒(分じゃないよ(^^;)でした。
#テスト環境は
  CPU:  AMD K6-2(300MHzを375MHz駆動(^^;)
  DISK: Quantum FB 8MB(NTFS, Busmastering 有効)
  OS:   NT4.0WS SP4
 てな感じです。ご参考までに。


[ ]
RE:00542 マクロの件No.00543
杉浦 まさき さん 99/05/07 02:43
 
え〜と、使った gawk の出所が書いてなかったので補足ですが、
Cygnus GNU-Win32 (Beta19) に付属の物です。
#Cygnus〜 については下記の URL を参照して下さい。
 http://www.cygnus.com/misc/gnu-win32/

補足のついでに sed(出所は同上) で試した結果も紹介しておきます。
#コマンドプロンプトで
 C:\> sed -n -e "N;N;N;s/\n/,/;P" org_data > new_data
 (org_data : 元データファイル名、
 new_data : 変更されたデータを保存するファイル名)
 と入力します。

前回と同じ環境でテストした所…4秒かかりませんでした(^^;。
ディスクキャッシュの関係か多少誤差はありますが、
それでも5秒はかからないですね。

ではでは。

[ ]
RE:00543 マクロの件No.00544
番頭++ さん 99/05/07 12:13
 
昨日は「秀丸」マクロの置換を 32 K 単位でテストをしただけで、確かに、今回
の簡単な置換は perl とかでは  1/100 位の処理時間で終わると思います。頻繁
に使う処理で、10 万行を超えると perl にしています。perl をビシバシとコー
ドできないので、マクロを使用しています。

実行してみないと、結果が予測できない処理が結構あります。例外がある場合と
か、いつもは、もっと複雑な、曖昧なロジックを「秀丸」マクロで書きます。他
の人に perl でロジックを組んでもらう時には、その仕様を書くか説明する必要
があります。その仕様を書くよりマクロをコードする時間のほうが少ないのでそ
うしています。

例として、英語のマニュアルを翻訳会社に出して、その結果をチェックする必要
があるときです。翻訳をする人は同じ誤訳を繰り返す傾向があります。IME の学
習も誤字を作り出すことがあります。テキストを見て、チェックしながら、段落、
前後の文章、単語を考慮して、文字検索パターン、ロジックをマクロにします。
その積み重ねが次回のチェックに役立ちます。校正の前処理みたいなものです。

「明日の朝までに終わればいいや ... 」と思うこともあります。過去にそれで
終わらなかったことも数回あります。悲劇 ...


[ ]
RE:00541 マクロの件No.00545
番頭++ さん 99/05/07 19:48
 
> 時間は、43分14秒 でした。

できれば、
今後のために、参考として、わかる範囲で、
CPU, Disk とかの環境を知りたいです。Pentium xxx, K2/3-xxx とか ???

> 大変ありがとうございました。秀丸に精通された方とお見受けされますが、お仕事で
> よくお使いなのでしょうか。

仕事にも、使用しています。個人的なメール作成にも使用しています。

> 今後ともよろしくお願い致します。

よけいな、お節介と言わないでくださいね、
スケットは何処かに居るかも知れませんです、
でも、助け舟は「自力本願」がベースだと思います。この場合には 。。。

[ ]
RE:00545 マクロの件No.00546
kobo さん 99/05/07 21:24
 
お世話になります。

お問い合わせのパソコンですが、PENTIUM 200M で、HDは残りが、2
50Mbくらいあります。

しかし、どう考えても恐るべき処理ができるのですね。初めての経験のマクロは実に
有効な処理であるかを痛感
させられました。番頭さん みたいになりたいものです。マクロ解説の参考書を捜し
てみようかと思っています。

マクロ機能にはソートする機能があるのでしょうか。ヘルプを見ている限りはないよ
うですが。

FROM KOBO

>> 時間は、43分14秒 でした。
>
>できれば、
>今後のために、参考として、わかる範囲で、
>CPU, Disk とかの環境を知りたいです。Pentium xxx, K2/3-xxx とか ???
>
>> 大変ありがとうございました。秀丸に精通された方とお見受けされますが、お仕事で
>> よくお使いなのでしょうか。
>
>仕事にも、使用しています。個人的なメール作成にも使用しています。
>
>> 今後ともよろしくお願い致します。
>
>よけいな、お節介と言わないでくださいね、
>スケットは何処かに居るかも知れませんです、
>でも、助け舟は「自力本願」がベースだと思います。この場合には 。。。

[ ]
RE:00543 マクロの件No.00547
kobo さん 99/05/07 21:27
 
ご多忙のところありがとうございます。

ご専門の方がおられて大変感謝致しております。

早速調べてみます。



>え〜と、使った gawk の出所が書いてなかったので補足ですが、
>Cygnus GNU-Win32 (Beta19) に付属の物です。
>#Cygnus〜 については下記の URL を参照して下さい。
> <a href="http://www.cygnus.com/misc/gnu-win32/">http://www.cygnus.com/mis
c/gnu-win32/</a>
>
>補足のついでに sed(出所は同上) で試した結果も紹介しておきます。
>#コマンドプロンプトで
> C:\> sed -n -e "N;N;N;s/\n/,/;P" org_data > new_data
> (org_data : 元データファイル名、
> new_data : 変更されたデータを保存するファイル名)
> と入力します。
>
>前回と同じ環境でテストした所…4秒かかりませんでした(^^;。
>ディスクキャッシュの関係か多少誤差はありますが、
>それでも5秒はかからないですね。
>
>ではでは。

[ ]
RE:00546 マクロの件No.00548
番頭++ さん 99/05/08 16:27
 
> お問い合わせのパソコンですが、PENTIUM 200M で、HDは残りが、2
> 50Mbくらいあります。

Peuntium 200 のクラスですと、

>> 時間は、43分14秒 でした。

くらいでしょう。例の a2.mac は AMD K6 のほうが速いみたいです。
disk の速さにも、依存すると思いますが。

余談ですが、参考のために、自宅の Pentium MMX 233、には理論上は、会社より
速い disk を持っていますが、会社の K6-233 よりかなり遅く、さらに自宅のノ
ート Pentium 150 よりも遅いという結果になりました。a2.mac の性格でしょう ...
ものすごく、ショックでした。今年の夏は K6-3 がほしい ...

「秀丸」と「卓駆★」だけで用が足りれば、Pentium はいらない ???

> マクロ機能にはソートする機能があるのでしょうか。ヘルプを見ている限りはないよ
> うですが。

マクロにはソートの命令、関数はありません。少ない数のソートは自分でロジッ
クを書くしかないです。(数) 100 件位が限度かなと、個人的な意見です。マク
ロは変数が増えるとすごく遅くなります。フリーの CBSORT という、クリップボ
ードのソートを使用しています。32 K bytes の制限があります。今でも、数千
件を越えると、DOS のソート (XSORT) を使用しています。
そのソフトの作者の方に感謝、感謝です ...

http://www.vector.co.jp/ とかで探してください。

kobo さんが、処理するデータの件数は、いつも数千件を超えるのでしたら、個
人的には、perl 見たいな言語をお勧めします。1/100 の処理時間ですから ...
perl にはソートもあります。perl を覚えると「鬼に金棒」と同僚は言います。
負けず嫌いな性格で、「どうせマクロはラジオペンチよ」と言っています。

この件はこれで終わりにしたいと思います。


[ ]