2017-05-30 10 views
1

私は、taqと呼ばれるライブラリで日付の後に付けられた一連のデータセット(たとえば、20130102)を持っています。通常、複数のデータセットを読み込もうとすると、私はset taq.cq_&yyyymmdd:;を実行します。したがって、yyyymmddを201201として入力すると、接頭辞201201で始まるすべてのデータセットがフェッチされます。SASマクロがデータセットをループする

ただし、すべてのデータセットにわたってマクロを実行しようとしています。理想的には:

%MACRO EXAMPLE(DATE_VAR); 
    DO WHILE(...); 
     %ANOTHER_MACRO(SOMETHING); 
    END; 
%MEND; 

I入力%EXAMPLE(201301);場合、それは私がそれを行うために行うループを設計する方法を思っていたプレフィックス201301.

で始まるすべてのデータセットに対して実行される別のマクロを呼び出すのだろうか?

SAS forumStackOverflowの投稿を読んでいます。しかし、彼らは、すべてのデータセットでマクロを実行するか、実行中のデータセットのリストを手動で入力する必要があります。私はプロシージャを自動化しようとしています(つまり、プログラムはプレフィックスを持つすべてのデータセットを検出できます)。

+0

SASのチュートリアルのための最高の参照とどのようになっているのですどちらかlexjansen.com、社会と同じ.sas.com。また、UCLA SASのチュートリアルも素晴らしいですが、少し古くなっています。 – Reeza

答えて

2

メタデータからデータセット名のリストを読み込みます。 DICTIONARY.MEMBERS(SASHELP.VMEMBERとしても使用可能)を使用できます。または、PROC CONTENTSを使用してリストを生成することもできます。

たとえば、データセットを指すlibrefと特定のメンバーの選択に役立つその他のパラメータを指定することができます。リストを取得したら、マクロ呼び出しを生成します。たとえば、CALL EXECUTE()を使用してマクロ呼び出しを生成することができます。

%macro example(libref,prefix); 
    proc contents data=&libref.._all_ noprint out=contents; run; 
    data _null_; 
    set contents; 
    by memname; 
    if first.memname ; 
    if upcase(memname) =: %upcase("&prefix"); 
    call execute(cats('%nrstr(%another_macro)(',memname,')')); 
    run; 
%mend; 

は次にあなたの例のための呼び出しは次のようになります。SO存在していた前に戻って、ユーザ書かれた記事です

%example(taq,cq_201301) 
+0

次のコードでmemnameをpringするために%another_macroを作ろうとしました:proc print data = memname;それは実行するために永遠にかかると何かを印刷することはできないようだ。これは奇妙です... –

+0

MPRINTオプションは、マクロが生成する生成されたSASコードを出力するので、マクロ呼び出しをデバッグするのに便利です。あなたは '%another_macro()'マクロを呼び出して動作させることができますか? '%example()'マクロを1つのデータセットの正確な名前で呼び出して、それが機能するかどうか確認できますか? – Tom

+0

%example( 'taq、cq_201301')は文字列なので代わりに行うべきですか? –

関連する問題