基礎学習

【SAS】基礎06_外部ファイルへの出力(FILE・PUTステートメント、フォーマット出力、リスト出力)

1. SASから外部データへの出力

ここでは、SASで処理した結果を、SASデータセットとしてではなく、カンマ区切り(CSV)やタブ区切り(TSV)などの外部データとして出力する方法について紹介していく。
 


 

2. FILE・PUTステートメント

外部ファイルへの出力処理の、基本的な構造は外部ファイルの読み込みと同様である。FILENAMEステートメントで出力先に参照名を割り当て、DATAステップで実際の出力をおこなう。そして、DATAステップ内でINFILEに対応するのがFILE、INPUTに対応するのがPUTの各ステートメントである。

①FILEステートメント
PUTステートメントの出力先を指定する。FILEステートメントを省略した場合、PUTステートメントの出力先はログとなる。

②PUTステートメント
変数値に想定外の値が含まれているときや、予期しない処理を検出したいときに、ログにERRORやWARNINGを表示させたい場合がある。そういった場合に、PUTステートを使用することが多く、FILEステートメントと併用することで、外部ファイルに出力することもできる。

外部ファイルにデータを書き込むDATAステップの基本構造

FILENAME 参照名 "外部ファイルを出力するフォルダのフルパス名";

DATA _null_;

	SET 出力データセット名;

	FILE 参照名(外部ファイル名) オプション;

	その他のSASステートメント;
	その他のSASステートメント;
	・・・;

	PUT
		変数の書き込み定義
		変数の書き込み定義
		・・・
	;
RUN;

FILENAME 参照名 CLEAR;

 

3. キャラクター形式データのフォーマット出力

キャラクター形式の様な固定長データを出力する時は、読み込み時のインフォーマットを使った処理とほぼ同様の記述をすればよい。具体的にはPUTステートメントでフォーマットを使用する。この出力形式をSASはフォーマット出力と呼ぶ。

SASが提供するカスタマイズされた出力指示のことをフォーマットと呼ぶ。インフォーマットの逆の機能を果たすもので、SAS変数の値を書き出すためのものである。プログラム内での記述方法は基本的にインフォーマットと同じである。数値変数を書き出すための数値フォーマット、文字変数を書き出すための文字フォーマットという分類もインフォーマットと同様である。ここでは、最も標準的な以下のフォーマットだけ押さえておこう。

①w.dフォーマット
・数値データを数値テキストとして書き出すときに指定する。
・w(出力のフィールド幅・カラム数)は、最大32まで指定可能である。
・dは小数点以下の桁数を指定し、小数点以下を出力したい場合は必ず指定する。

【例】
「num=10.25」という数値があった場合、「10.25」の長さはピリオド「.」も含めて5バイト、小数点以下2桁なので、「put num 5.2」と指定する。その出力結果は「10.25」となる。
「num=10.25」に対して「put num 7.4」と指定した場合、「10.2500」と出力される。
「num=10.25」に対して「put num 4.1」と指定した場合、「10.3」と四捨五入されて出力される。

②$w.または$CHARw.フォーマット
・文字データを書き出すときに指定する。
・wは1~32767の範囲で指定することができる。
・文字データの前置ブランクを除去せずにそのまま出力したいときは、$CHARw.を使用する。

【事前準備】
下図のようなデータセットを用意する。
data list_fixed;
	infile datalines;
	input
		@1  first_name  $10.	/*$w.インフォーマット*/
		@1  first_name2 $char10./*$CHARw.インフォーマット*/
		@11 last_name   $10.	/*$w.インフォーマット*/
		@11 last_name2  $char10./*$CHARw.インフォーマット*/
		@21 sex		1.	/*w.dインフォーマット*/
		@22 age		2.	/*w.dインフォーマット*/
	;
datalines;
     Kaori       Ito222
    Hideki    Tanaka135
      Taro    Yamada130
    Hiroki      Sato125
     Mizue     Ishii254
      Yuko    Koyama230
    Ichiro    Suzuki1
    Shinji      Suda127
     Reiko  Yamauchi242
    Mituru    Adachi345
;
run;

list_fixed

【フォーマット出力の例】
上記の事前準備で作成したSASデータセット「list_fixed」をフォーマット出力する。

filename out "C:\Users";
options missing="";

data _null_;
	set list_fixed;
	file out(list_fixed.txt) lrecl=1000 stopover;
	put
		@1  first_name2  $char10.
		@11 last_name2   $char10.
		@21 sex		 1.
		@22 age		 2.
	;
run;

options missing=".";
filename out clear;

・MISSINGオプション
ここでは、欠損値の出力をピリオド「.」からスペースに変更している。欠損値をピリオド「.」のまま出力する機会はあまりない。

・stopover
PUTの出力定義で指定されたカラムが、論理レコード長(lrecl)を超えたときにエラーが出るようにするオプション。

【実行結果】
フォルダ「"C:\Users"」直下に「list_fixed.txt」が出力されている。
list_fixed_format

 

4. カンマ区切り(CSV)・タブ区切り(TSV)形式データのリスト出力

①DATAステップによる出力

【例】
data _null_;
	set list_fixed;
	file out(list_csv.csv) dlm="," dsd lrecl=1000 stopover;

	/*1行目に変数名を出力する*/
	if _n_ = 1 then do;
		put
			"first_name"	","
			"last_name"	","
			"sex" 		","
			"age"
		;
	end;

	/*2行目以降にデータ部分を出力する*/
	put
		first_name
		last_name
		sex
		age
	;
run;

filename out clear;

【実行結果】
list_fixed_csv

 

②EXPORTプロシジャを使った出力

【事前準備】
まず、以下のように、サンプルSASデータセットlist_labelを用意する。
data list_label;
	infile datalines dlm="," dsd missover;
	attrib
		first_name	length=$20. label="First Name"
		last_name	length=$20. label="Last Name"
		sex		length=8.   label="Sex"
		age		length=8.   label="Age"
	;
	input
		first_name
		last_name
		sex
		age
	;
datalines;
Kaori,Ito,2,22
Hideki,Tanaka,1,35
Taro,Yamada,1,30
Hiroki,Sato,1,25
Mizue,Ishii,2,54
Yuko,Koyama,2,30
Ichiro,Suzuki,1,.
Shinji,Suda,1,27
Reiko,Yamauchi,2,42
Mituru,Adachi,3,45
;
run;

list_label

 

【CSVファイルを出力する例】
proc export
	data=list_label
	outfile="C:\Users\list_export.csv"			
	dbms=csv	
	replace;
run;

【実行結果】
list_label

 

【タブ区切りで、変数名ではなくラベルを出力する例】
proc export
	data=list_label
	outfile="C:\Users\list_export.tsv"			
	dbms=dlm
	label
	replace;
	delimiter="09"x;
run;

【実行結果】
list_export_tsv

関連マクロ
hojin_list
【SAS】テキストファイル(カンマ区切りCSV、タブ区切りTSV)の出力

目次 1.サンプルデータ2.展開例・カンマ区切りで出力・タブ区切りで出力・ヘッダーをラベルで出力・ヘッダー無しで出力・UTF-8で出力・UTF-8、BOMなしで出力3.PROC EXPORTで出力しな ...

続きを見る