The Nameless City

何故か製薬やSAS関連のブログ、の予定。

意外と知られていない、データセットの指定方法。

ネタ用のソース。

手持ちのSASで試して見て下さい。
しかし、SAS On Demandの場合にはこれで動くかはやってないので正確な所は分かりませんが多分出来ないです。SAS University Editionも同様で、SAS Integration Technology上に乗っかってるのでは、XCMDが無効化されているので、データ作成とかCDとかが多分無理。
(XCMD/NOXWAIT/XSYNCが望ましいです)
WORKライブラリの配下であればフォルダもありますが、他、システムオプションが権限コントロールされているので無理かなとも思います。

** 下のテスト用のフォルダは、自分の環境に合わせて適宜変更して下さい ** ;
%let _FLD=C:\Workspace\tmp ;
%let _DR=C: ;
/*
念の為。
Windows環境下では、UNCパスでは最後のCDコマンドが動かないので注意
*/

** テストデータ一次作成 ** ;
libname TEST base "&_FLD." ;


data  TEST.CLASS ;
	set SASHELP.CLASS ;
	attrib MEMO length=$20. ;
	retain MEMO ;
	if _N_ = 1 then MEMO='demo用データ' ;
run ;

** このライブラリ設定がクリアされていない場合には、そのライブラリを使いにいく ** ;
libname TEST clear ;

title '**フルパス指定**' ;
title2 '**こんな指定の仕方で大丈夫か**' ;
footnote '**問題ない**' ;
proc print data="&_FLD.\class.sas7bdat" ;
quit ;

footnote ;


title '**定義情報**' ;
proc contents data="&_FLD.\class.sas7bdat" varnum out=_wk_def;
quit ;

title '**定義情報** ライブラリが自動設定されている...WC<連番>という形で定義される' ;

proc print data=_wk_def ;
quit ;

title '**ライブラリ定義(SAS...以外)...WC<連番>という形で定義される**' ;
proc print data=SASHELP.VLIBNAM ;
	where LIBNAME not like 'SAS%' and LIBNAME not like 'MAP%' and LIBNAME ^= 'WORK' ;
quit ;

** 自動割当されたライブラリを一旦クリアしておく ** ;
%let _w_lib = ;
proc sql noprint ;
	select LIBNAME into : _w_lib from SASHELP.VLIBNAM
	where LIBNAME not like 'SAS%' and LIBNAME not like 'MAP%' and LIBNAME ^= 'WORK' ; 
quit ;

data _null_ ;
	attrib LIB length=$10. ;
	LIB = symget('_w_lib') ;
	if not missing(LIB) then do ;
		call execute(catx(' ','libname', LIB,'clear ;')) ;
	end ;
run ;


**もしかしてこれファイル名変なのにしても大丈夫?** ;
title '**EXTEND指定の場合のSASデータセット名制限の緩和**' ;
option validmemname=extend ;


data "&_FLD.\1_class.sas7bdat" ;
	set "&_FLD.\class.sas7bdat" ;
run ;


title2 '**こんな指定の仕方で大丈夫か**' ;
footnote '**問題ない**' ;
proc print data="&_FLD.\1_class.sas7bdat" ;
quit ;
footnote ;


**名前リテラルを使うパターン** ;
title '**名前リテラル指定**' ;
libname TEST base "&_FLD." ;

title2 '**こんな指定の仕方で大丈夫か**' ;
footnote '**問題ない**' ;
proc print data=TEST.'1_CLASS'n ;
quit ;
footnote ;


**実はこんな酷い事がwww** ;
options xsync ;
x "cd ""&_FLD.""" ;
x "&_DR." ;
/*
念の為。cd /d ...のコマンドはSASは理解しない為、
/d つけると失敗します。
*/
title '**相対パス指定**' ;
title2 '**こんな指定の仕方で大丈夫か**' ;
footnote '**問題ない**' ;
proc print data='1_class.sas7bdat' ;
quit ;

データセットの指定方法の簡単な説明。

普通のやり方。

「<ライブラリ名>.<データセット名>」ですよね。
因みに、ライブラリ名を省略した、「<データセット名>」の場合、WORKライブラリ配下に作成される

のが普通なのですが、実はUSERシステムオプションに従う事になってます。そのデフォルトがWORKです。
ただ、このオプション、キリキリ切り替える人ってそういないと思います。設計時点で仕込めば問題ないんですが。
そういう言語仕様なので、SASのソリューションで自動生成されるプログラムではまずライブラリ名は省略されてないと思います。

パス指定。

引用符で囲む事によって、「パス指定でデータセットとして認識させられる」んです。


これ、面倒臭いだけじゃんとか思われるかとも思いますが、ライブラリ設定をしなくても済むってのが利点で、勝手にBASEエンジンのライブラリが定義されてその下に出来ているように見えます。


ただ、この仕様ちょっと厄介で面白い所もあります。
'c:\workspace\tmp\class'で指定→「c:\workspace\tmp\class.sas7bdat」で作成。
'c:\workspace\tmp\class.dat'で指定→有効ではない拡張子が指定されているとしてエラー。


つまり、パス指定と言えども、実際には「ライブラリの自動登録と、データセット名の推論」で動いているかと思われます。
これ、

data CLASS ;
    set SASHELP.CLASS ;
run ;
data 'CLASS' ;
    set SASHELP.CLASS ;
run ;

どちらでも大抵はclass.sas7bdatファイルが出来るのです。
「ライブラリが省略された場合に補完される」のは通常「WORKライブラリ」なので、そこに出来るのですが、
相対パス指定」の場合には通常SAS起動時に設定されている作業フォルダ(カレントディレクトリ)なので、素のSAS起動直後では「%userprofile%」(C:\Users\)に出来ます。