DS2でも外部ファイル出力はできます!!な話

ちょっとソース見つけられなかったんですが、だいぶ昔、海外のSASブログだったか何かのサイトで、「DS2にはfileステートメントがないみたいだぜ!」「マジかよ!ヤベェな!ハンドリング専門かよ!DS2はXXXX(なんか汚い言葉)だな!」みたいな外人同士のやりとりがあって、それをボーっと見てて、なんとなく頭に残ってました。

そうなんだぁ~、アウトプット部分は通常のSASコードで書かなきゃいけないんだ、そりゃXXXXだなぁって思ってたんですが、流石にそんなわけなかったですね。
普及し始めはガセじゃないですけど、みんな知らないんで結構間違ったコード上がるんで注意です。僕の記事に関しても間違いが含まれていることは多々あるはずなので鵜呑みは注意です。

話を戻しまして、実際問題ちょっと気づきにくいところなので説明します

じゃあまずはテストデータ

data Q1;
x=1;Y='A';output;
x=2;Y='B';output;
x=3;Y='C';output;
run;

そして、手始めに以下のコードを見てください

proc ds2 libs=work;
data _null_;
method run();
set Q1;
put X Y;
end;
enddata;
run;
quit;

こうすると、ログに






って出力されます。

うん、そりゃそうだろうね。データステップもそうじゃん。

データステップなら、putの前に、file print;ってつければアウトプットウインドウに
出力するし、先にfilenameで外部ファイルを定義してfileで指定すればそこに出力されます。

でも、DS2はfileステートメントないんだよね?じゃあやっぱ無理じゃん。

と思ったところで、次のコード見てください。

proc ds2 libs=work;
data ;
method run();
set Q1;
end;
enddata;
run;
quit;

?何が違うの?って思った方は、もう一度よく見てください。まずdata の後に_null_がなくなってます。旧データステップで、dataの後何もつけないと、何が起こるかは以下の記事を読んでください

「どうてもいい話 データセット名をかかずに実行」
http://sas-tumesas.blogspot.jp/2013/10/blog-post_1261.html

ようは勝手に連番でDATA1とか2とか作られていきます。
次にもう一点、putで何も指定してない!

これを実行すると何が起きるかというと
アウトプットウインドウに以下のような出力がでます







なるほど!そういうことか!SQLプロシジャでcreate tableつけずにselect文流すのとおなじですね。抽出結果がそのままアウトプットになるわけですか。

もうここまできたら読めてきましたね。
つまり、外部ファイルへの出力はアウトプット デリバリー システム、そうODSでやれってことですよ。

例えばcsvで欲しければ

filename outf "aa.csv";
ods tagsets.csv file=outf;
proc ds2 libs=work;
data;
method run();
set Q1;
put X Y;
end;
enddata;
run;
quit;
ods tagsets.csv close;

とすればOKなわけです。

9.4からods excelがあるから、拡張子xlsxにしてtagsets.csvのところをexcelにすれば
みんな大好きEXCELファイルも作れます

以上です!

0 件のコメント:

コメントを投稿