BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
sskt
Quartz | Level 8

proc streamの使い方がよくわからず、ググってもよくわからないため質問させていただきます。

 

SQL文をtxtに出力したいと考えており、id一覧のテーブルは既に作成しており、その前にproc streamで定型文を挿入したいと考えております。
proc streamを利用したい理由は、一行ずつputするのが億劫なのと、クオートやマクロ変数の取り扱いが楽だと思ったためです。
ですが、proc streamをまだよくわかっておらず調べても解決しないので質問させていただきました。以下コードだとputした部分は出力されますが、streamの部分は出力されなくなってしまいます。

(特にセミコロンを4つ並べる部分がわからなかったりします。)

 

よろしくお願いいたします。

 

filename file "id_sql.txt";
proc stream outfile=file resetdelim="goto";
begin select * from goto NEWLINE;
where x1 in (
;;;;
run;
data _null_;
set id_list end=eof;
file file lrecl=9999 stopover;
if _n_ = 1 then tmp = cats("'", x1, "'");
else tmp = cats(",'", x1, "'");
  put tmp;
if eof then put ');';
run;
filename file clear;

 

1 ACCEPTED SOLUTION

Accepted Solutions
yu_sas
SAS Employee

セミコロン4つはSTREAMプロシジャの終了を示しています。これはDATALINES4ステートメントと同様です。

今回の場合、FILEステートメントはデフォルトで追加ではなく置き換えであるため

STREAMプロシジャで記述した箇所が上書きされてしまっています。これは

FILEステートメントにMODオプションを指定することで追加するようにできます。

※FROM句にデータセット名を指定する必要があると思います。

 

file file lrecl=9999 stopover mod;

もしくは以下のように先にPUTステートメントによる出力を外部ファイルに出力しておき

STREAMプロシジャ内で%INCLUDEステートメントを用いて呼び出してもいいと思います。

 

filename tmp1 temp;
data _null_;
    set id_list;
    file tmp1 lrecl=9999 stopover;
    if _n_ = 1 then tmp = cats("'", x1, "'");
    else tmp = cats(",'", x1, "'");
    put tmp;
run;

filename file "c:\temp\id_sql.txt";
proc stream outfile=file resetdelim="goto";
begin select * from test goto NEWLINE;
where x1 in (
goto;
%include tmp1;
);
;;;;

View solution in original post

1 REPLY 1
yu_sas
SAS Employee

セミコロン4つはSTREAMプロシジャの終了を示しています。これはDATALINES4ステートメントと同様です。

今回の場合、FILEステートメントはデフォルトで追加ではなく置き換えであるため

STREAMプロシジャで記述した箇所が上書きされてしまっています。これは

FILEステートメントにMODオプションを指定することで追加するようにできます。

※FROM句にデータセット名を指定する必要があると思います。

 

file file lrecl=9999 stopover mod;

もしくは以下のように先にPUTステートメントによる出力を外部ファイルに出力しておき

STREAMプロシジャ内で%INCLUDEステートメントを用いて呼び出してもいいと思います。

 

filename tmp1 temp;
data _null_;
    set id_list;
    file tmp1 lrecl=9999 stopover;
    if _n_ = 1 then tmp = cats("'", x1, "'");
    else tmp = cats(",'", x1, "'");
    put tmp;
run;

filename file "c:\temp\id_sql.txt";
proc stream outfile=file resetdelim="goto";
begin select * from test goto NEWLINE;
where x1 in (
goto;
%include tmp1;
);
;;;;