SASマクロ データ変換

【SAS】数値やマクロ変数値に前ゼロ(ゼロパディング)を付与する(%SYSFUNC、PUTN)

%SYSFUNC関数とPUTN関数を組み合わせることで、数値やマクロ変数値に前ゼロ(ゼロパディング)を付与することができます。

数値に前ゼロを付与する例

以下は、数値1に前ゼロを付与する例です。

%put %sysfunc(putn(1, z2.));
%put %sysfunc(putn(1, z3.));
%put %sysfunc(putn(1, z4.));
%put %sysfunc(putn(1, z5.));

以下は、ログへの出力結果です。

01
001
0001
00001

 

%IFステートメントを使用する例(おススメしない)

ループインデックス変数に前ゼロを付与する方法として、%IFステートメントを使用する方法があり、たまに見かけることがあります。

%macro zero_padding_not_good;
	
	%local i;

	%do i = 1 %to 10;
		%if &i. < 10 %then	%put 0&i.;
		%else				%put &i.;
	%end;

%mend zero_padding_not_good;

%zero_padding_not_good;

以下は、ログへの出力結果です。

01
02
03
04
05
06
07
08
09
10

条件分岐で前ゼロの有無を判定しているのですが、スマートさを感じられず、個人的にあまり好きになれないやり方です・・・。

これでは、前ゼロを3つ、4つと増やしたい場合に柔軟に対応できません。
 

%SYSFUNCとPUTNを組み合わせる例(おススメ)

以下は、おススメしている%SYSFUNC関数とPUTN関数を組み合わせた例です。

%macro zero_padding(digit);

	%local i;
	
	%do i = 1 %to 5;
		%put %sysfunc(putn(&i., z&digit..));
	%end;

%mend zero_padding;

%zero_padding(2);
%zero_padding(3);
%zero_padding(4);

上記のコード実行すると、以下のような出力結果になります。

01
02
03
04
05
001
002
003
004
005
0001
0002
0003
0004
0005

引数digitを任意に指定して展開するだけで、桁数を自在に変更することができます。

もし、もっとスマートなやり方があるという方は、お教え頂けるとありがたいです。