秀丸マクロがおもしろいという記事を書いて以来、何か要件はないだろうかとさがしていた。
秀丸マクロがおもしろくて練習のため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;