CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

秀丸マクロ第3弾は「指定した列数、レコード数でCSVファイルを作る」

投稿日:2019年6月16日 更新日:

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

-ソフト開発

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

zipcopy Ver1.02リリース

昨日に引き続きリビジョンアップを実施して、Ver1.02とした。 Ver1.02での変更点は以下の通り。 ・7zipを使わずに、DotNetZipの機能で圧縮・解凍を行えるようにした。 ・ファイル削除 …

PDFへのなんちゃって捺印ではつまらんのでデジタル署名とタイムスタンプを付けてみることを検討中

PDFアレコレで捺印できるようにしたのはいいけど、しょせんはなんちゃって捺印。だって、好きな印影が作れてヒョっと捺印できちゃうわけで、なりすましができてしまうから。そんなこと言ったら、アナログな印鑑だ …

no image

家で仕事

そもそも家でパソコンを買ったのは、仕事をするためだ。 う~ん、仕事とも言えるけど仕事とも言えない感じがする。 ドスパラのPrime、22万円なり。 結構な投資だったけど、後悔はしてない。 今、そのNe …

no image

イテレータ(Iterator)

あるコンポーネントで初めて出会いました。コンポーネントがバージョンアップされたときに、オブジェクト指向的な作りに一新されて、いろいろ変わったのですが中でもイテレータという訳の分からないものに遭遇して、 …

PDFアレコレにページ挿入機能を追加

PDFアレコレのページ挿入機能とちょっとした不具合修正。 Ver2.08 2020/5/6 ・ページ挿入に対応した。指定したページの前に、指定したPDFファイルまたは空白ページを挿入できる。指定ページ …