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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

暗号

こんな本を買った。 『RSA 暗号技術の基礎からC++による実装まで』 ソフトの認証を行うのに、シリアル番号とパスワードを使いたいから。 シリアルは、一定の桁数のランダムな数値とする。 パスワードは、 …

no image

メイリオが他のフォントとくらべて小さく表示される件

左側がMS Pゴシックで、右側がメイリオ。 高さを同じ80pixcelで書いているのに、メイリオは3割型小さくなる。 メイリオの場合、GetTextMetricsで取得できるtmInternalLea …

no image

VC6デバッグ

ここ数年抱えていた問題が一つ解決したので、ここに記しておこう。 VC6でデバッグしていると、たまに戻ってこないことがあったのさ。 別の言い方をすると、固まる、凍る、フリーズ、ハングアップ。 マウスは動 …

若いもんにC++を教えてやって、これまでやってきたことが少しでも伝わってくれればと願う夜

ファイルをセレクトするというC++で作ったActiveXのDLLのデバッグができないかと彼がおいらのところに来た時点で、そいつはなかなかチカラがあるなと感じた。

インフラSEへの道~マジックパケットを送信してマシンを起動する~

Wake On LANを試してみようと以下の記事を書いたわけだが、PowerShellでマジックパケットを送信しようとしたところ、PowerShellのセキュリティや文字コードがややこしいと感じて、自 …