2017-05-17 19 views
1

SAS DI Studio内でカスタム変換を作成して、頻繁に再利用したい複雑な処理を行っています。これを達成するために、最初のステップとして、単純なAPPEND変換の機能を再現しようとしています。番号の付いたマクロ変数でSAS SET文を使用する

この目的のために、複数入力(最大10個)を有効にしてhereというマクロ変数&_INPUTn&_INPUT_countを利用しようとしています。マクロ変数は、名前がない、彼らはを参照して、データセットの名前に解決されるので

ERROR: Missing numeric suffix on a numbered data set list (WORK.SOME_INPUT_TABLE-WORK.ANOTHER_INPUT_TABLE)

:私はしかし、私は次のエラーが表示され、単純にコード

data work.APPEND_DATA/view=work.APPEND_DATA; 
    %let max_input_index = %sysevalf(&_INPUT_count - 1,int); 
    set &_INPUT0 - &&_INPUT&max_input_index; 
    keep col1 col2 col3; 
run; 

を使用したいです

SET dataset1 - dataset9; 

ステートメントに必要な形式に従ってください。どうすればこの問題を回避できますか?

多くの感謝です。

+0

とにかくループを張って追加する場合は、proc appendを使ってループすることをお勧めします。データサイズによっては、データを1行ずつ処理しないため、処理速度が向上します。 – Reeza

+0

さて、私はそのアプローチを検討します。私は当初、SAS DI premade変換を使用して追加を構築しました。その後、ジョブコードをカスタム変換に変換するときに、自動生成されたコードを貼り付けてコピーしました。なぜSASがproc appendよりもむしろこのようなやり方をしているのか分かりませんが、私は効率化のために努力します! – Rookatu

答えて

2

リストをループして変数を解決するマクロを作成する必要があります。何かのように

%macro list_tables(n); 
    %do i=1 %to &n; 
     &&_INPUT&i 
    %end; 
%mend; 

data work.APPEND_DATA/view=work.APPEND_DATA; 
    %let max_input_index = %sysevalf(&_INPUT_count - 1,int); 
    set %list_tables(&max_input_index); 
    keep col1 col2 col3; 
run; 
+0

これは、マクロ関数への入力に最初に '&'を付けることを除いて、機能しました。 マクロコードに慣れていない人の観点から見た巧妙なソリューションです。 ありがとうございました! – Rookatu

+0

欠落した '&'をうまく捕まえます。編集して修正しました! – DomPazz

0

SETステートメントは、数値の接尾辞付きの名前のシーケンスを構成しない可能性があるため、実際のデータセット名のリストを必要とします。

既にマクロを実行している場合は、マクロ%DOループを使用できます。 %DOループ内でセミコロンを生成しないように注意してください。

set 
%do i=1 %to &_inputcount ; &&_input&i %end; 
; 

しかし、データステートメントを使用して、SETステートメントで使用できる単一のマクロ変数に名前を連結することもできます。

data _null_; 
    call symputx('_input1',symget('_input')); 
    length str $500 ; 
    do i=1 to &_inputcount; 
    str=catx(' ',str,symget(cats('_input',i))); 
    end; 
    call symputx('_input',str); 
run; 
data .... ; 
    set &_input ; 
    ... 

カウントが1であり、SASのみ数値サフィックスを持つマクロ変数の系列を作成するのではなく、_INPUTマクロ変数を作成する場合を処理するデータ・ステップの先頭に余分のCALL SYMPUTX()。これにより_INPUT1が_INPUTの値に設定され、DOループは引き続き機能します。

関連する問題