秀丸マクロがおもしろいという記事を書いて以来、何か要件はないだろうかとさがしていた。
秀丸マクロがおもしろくて練習のため2つのマクロを作ってみた
「指定した列数、レコード数でCSVファイルを作る」なんて要件が出てきたので作ってみた。今回とトライで得られた知識やポイントを以下に列記する。
・サブルーチンの作り方を習得するのに時間がかかった
・変数名に##や$$と指定するのは、ルーチン内でのみ利用する変数であることがわかった
・数値を文字化する際に、指定桁で0埋めする関数が用意されていなかったので独自に作った
・処理を高速化するには、処理中に画面描画を止めればよい
なお、以下のマクロをそのまま実行すると4秒かかる。列が5つで5000レコードで、ファイルに保存すると500kbそこそこ。20倍の10万レコードで作ろうとしたら、80秒もかかってしまう計算。高速化する方法がきっとあるのだろうが、それは今後の課題としておく。
///////////////////// // CSVを作る setcompatiblemode 0x0F; #clNum = 5; // 列数 #recNum = 5000; // レコード数 #byteLen = 20; // レコードのバイト数 #isInyoufu = true; // 引用符を付けるかどうか disabledraw; //画面の変更を停止 // ヘッダー部作成 ##j = 1; $$tmp = ""; while( ##j <= #clNum ) { call item_name ##j, 7, "属性"; $$aryName[##j-1] = $$return; $$atr = $$return; call inyoufuAdd $$atr; $$atr = $$return; if( ##j != #clNum ) $$atr = $$atr + ","; $$tmp = $$tmp + $$atr; ##j = ##j + 1; } $$tmp = $$tmp + "\n"; insert $$tmp; // レコード部作成 ##i = 1; while( ##i <= #recNum ) { ##j = 1; $$tmp = ""; while( ##j <= #clNum ) { call item_name ##i, #byteLen, $$aryName[##j-1] + "_"; $$atr = $$return; call inyoufuAdd $$atr; $$atr = $$return; if( ##j != #clNum ) $$atr = $$atr + ","; $$tmp = $$tmp + $$atr; ##j = ##j + 1; } $$tmp = $$tmp + "\n"; insert $$tmp; ##i = ##i + 1; } enabledraw; //画面の変更を復帰 endmacro; /////////////////// // 以下サブルーチン // 接頭語+指定桁数値の文字列を作る // ##1 : 数値 // ##2 : 桁数 // $$3 : 接頭語 item_name: call keta_renban ##1, ##2 - strlen($$3); $$ans = $$3 + $$return; return $$ans; // 0で埋めた桁指定の数値文字列を作る // ##1 : 数値 // ##2 : 桁数 keta_renban: $$ans = str(##1); ##len = strlen( $$ans ); while( ##len < ##2 ) { $$ans = "0" + $$ans; ##len = strlen( $$ans ); } return $$ans; // 引用符を付ける // $$1 : 文字列 inyoufuAdd: $$ans = $$1; if( #isInyoufu ) $$ans = "\"" + $$ans + "\""; return $$ans;