ラベル pathname の投稿を表示しています。 すべての投稿を表示
ラベル pathname の投稿を表示しています。 すべての投稿を表示

SASのWORKの実際の場所に、異常終了した時の残り滓ファイルがたまるので大掃除する話

WORKライブラリに割り当てられた場所が実際PC上で、どこに存在するかについて、普段あまり意識しません。

ライブラリのパスを返すpathname関数や

data _NULL_;
X=pathname("WORK");
put X;
run;

optionss プロシジャを使って、WORKの実際の場所を割り出すことができます

proc options option=work;
run; 

環境によるかもですが、「SAS Temporary Files」というフォルダの下に
「_TD○○」といったフォルダがあり、そこがWORKに割り当てられていると思います
この「_TD○○」はSASを閉じると、フォルダごと消滅します。
またSASを立ち上げると、新たに「_TD○○」(○の部分は変わる)が作成されそこが
現セッションのWORKの実存パスになります。

普通にSASを立ち上げて、閉じていれば「SAS Temporary Files」の下には何もないのですが
異常終了するなどしてWORKの除去機能が正常に作動しなかった場合、「_TD○○」という過去の
一時フォルダが残ってしまうことがあります。

こいつらは只のゴミなのでばっさり消してしまって容量をあけた方がよいです。

以下はSASのFAQにあった同様の内容です。
http://www.sas.com/offices/asiapacific/japan/service/technical/faq/list/body/pc055.html



で、関連する荒業として、例えばグラフ等の画像ファイルをgifやpngなどで作成して、それをEXCELやWORDにDDEで貼りつけるプログラムを書く場合、いったん画像ファイルを作成する必要があるのですが、貼り付けが終わった後に画像はまとめて全部消したいと言った場合に、テンポラリーな画像の置き場としてWORKに割り当てられたフォルダをファイルの保存場所に使うという技です。
正常に終了すれば、いちいち画像を消すプログラムを書かなくても、WORKもろともフォルダごと葬られるからです。
「_TD○○」の中のファイルはSASが作ったものでなくても、ロックしてない限りいっしょくたに消されます。
まあSASの機能を逆手にとった外法に近いので、お勧めはしません。




SASデータセットを削除する方法

データセットを削除します。オブザベーションを消すのではなくそのものを消す方法です。

data DS1;
 X=1;
run;

今、WORKにDS1というデータセットがあるとします。


【方法1】
proc datasets lib=work;
 delete DS1;
run;
quit;

DATASETSプロシジャのdeleteステートメントでデータセットを指定します。


proc datasets lib=work kill;
 run;
quit;

ライブラリの中を全部消したい場合はkillです。

proc datasets lib=work;
 save DS1;
 run;
quit;

save だとそのデータセットだけ残します。

【方法2】
proc delete data=DS1;
run;

どなたかがブログか論文で紹介されていたと思うのですがdeleteプロシジャというのも
使えます。

【方法3】
proc sql;
 drop table DS1;
quit;

sqlプロシジャのdrop tableでも消せます。どうしてもSASでdropがでてくると変数を落とす
イメージが強いですが。

【方法4】
DATA _Null_;
length DSFILE $20.;
 rc = filename(DSFILE,pathname("WORK")||"\"||"DS1"||".sas7bdat");
 rc = fdelete(DSFILE);
run;

これ好きです。粗暴なコードで素敵です。実戦で使うのは微妙ですが。
ようはSASデータセットそのものをファイルとして
削除してしまおうという発想です。pathname関数でライブラリの実体パスを取得できます。
それにデータセット名と拡張子を繋げてfdeleteで削除します。
消してもエクスプローラーが更新されていないと残像のようにデータセットが表示されるのですが
実際ダブルクリックすると「すでにこのデータセットは存在しません」みたいなかっこいい
メッセージがでて、なくなります。
自分が死んでいることに気付いていない幽霊のようで神秘的です。