CONTENTS プロシジャ

【SAS】CONTENTSプロシジャの基本的な構文と使い方(変数定義、属性)

構文

PROC CONTENTS DATA = 入力データセット
		OUT = 出力データセット
		VARNUM	/*入力データセットの変数の並び順でアウトプットする*/
		NOPRINT	/*アウトプット結果が不要な場合に指定する*/
		;
RUN;

使用頻度の高いステートメントやオプションのみ記載

・変数の並び順について、VARNUMを指定してもアウトプット結果のみに反映されるだけで、出力データセットはアルファベット順となる

 

サンプルデータ

サンプルとして、以下のデータを使用していきます。

data sample;
	infile datalines dlm="," dsd missover;
	attrib
		type		length=8.		label="タイプ"
		type_name	length=$200.	label="タイプ名"
		type_label	length=$200.	label="タイプラベル"
		rank		length=8.		label="ランキング"
		maker		length=$200.	label="メーカー"
		maker_label	length=$200.	label="メーカーラベル"
		uriage		length=8.		label="売上"			format=comma8.
	;
	input
		type	
		type_name
		type_label
		rank	
		maker	
		maker_label
		uriage	
	;
datalines;
1,Passenger,乗用車,3,HONDA,ホンダ,30000
2,Light,軽自動車,4,NISSAN,ニッサン,50000
2,Light,軽自動車,3,DAIHATSU,ダイハツ,60000
1,Passenger,乗用車,1,TOYOTA,トヨタ,110000
1,Passenger,乗用車,2,NISSAN,ニッサン,40000
2,Light,軽自動車,1,HONDA,ホンダ,110000
2,Light,軽自動車,2,SUZUKI,スズキ,70000
;
run;


 

使い方

SAS Studioで実行しているため、BaseSASと出力結果が異なる場合がございます。

変数情報の取得

以下はシンプルな実行例です。

proc contents data = sample
			  out = sample_contents
			  ;
run;

以下は出力データセットsample_contentsの中身になりますが、変数の数が多いので、折り返して2段で表示しています。

上記の出力変数の内、比較的使用頻度が高いのは、赤枠部分になるかと思います。

変数TYPEは、1=数値変数、2=文字変数、という意味になります。

変数VARNUMは、入力データセットsampleの変数の(左から右への)並び順になります。

 

以下はアウトプット結果になります。

私の場合は、基本的にアウトプット結果は不要なので、常にNOPRINTオプションを指定しています。

 

VARNUMオプション

アウトプット結果の変数の並び順を、入力データセットと同じ並び順にしたいときは、VARNUMオプションを指定します。

proc contents data = sample
			  out = sample_contents_varnum(keep=name type length varnum label format)
			  varnum
			  ;
run;

以下のアウトプット結果のように、変数の並び順が入力データセットと同じになっています。

 

VARNUMオプションはアウトプット結果のみに作用するので、出力データセットsample_contents_varnumの並び順はアルファベット順のままになっています。

 

よく使うマクロ変数化の例

CONTENTSプロシジャは、業務において、CALL SYMPUTXルーチンと組み合わせて、変数情報をマクロ変数化する機会が多いです。

以下はその一例です。

%macro contents_macro(indata);
%put --------------------------------------------------;
%put contents_macro;
%put &=indata;
%put --------------------------------------------------;

	/*データの読込*/
	proc contents data = &indata.
				  out = _contents_macro_temp
				  noprint;
	run;

	/*変数の並べ替え*/
	proc sort data = _contents_macro_temp;
		by varnum;
	run;
	
	/*グローバルマクロ変数化*/
	data _null_;
		set _contents_macro_temp;
		call symputx("n_vars", _n_, "G");
		call symputx(cats("name", _n_),		name,	"G");
		call symputx(cats("type", _n_),		type,	"G");
		call symputx(cats("length", _n_),	length,	"G");
		call symputx(cats("label", _n_),	label,	"G");
		call symputx(cats("format", _n_),	format,	"G");
	run;
	
%mend contents_macro;

/*展開*/
%contents_macro(sample);

/*チェック*/
%put _global_;

以下はログに出力されるチェック結果です。

上記のように、変数情報がグローバル変数化されています。

変数TYPEをマクロ変数化すると、数値変数のときは△△、文字変数のときは〇〇、のような条件分岐ができるようになります。

業務効率化に興味のある方は、この機会にいろいろお試しください。