2017-03-16 21 views
1

SAS Enterpriseガイドの一部の変数を連結しようとしています。SAS CATXエラー:CATXのヌルパラメータが無効です

%do i = 1 %to 3; 
    %global farm_&i., apples_&i., pears_&i., cherries_&i., plums_&i.; 
%end; 

そして、次のよう

id  farm   apples  pears   cherries   plums 
1  'Munich'  'Granny'  'Williams'  'RedDelight' 
2  'Amsterdam' 'PinkLady'     'Scrumptious 
3  'Moscow'  'Braeburn' 'Williams'  'RedDelight'  

は、その後、私はグローバル変数を作成します。私はのようになりますSAS_table、で始まる

は(pearsのための空の列plumsと空の観察に注意してください。私は次のように上記の表をグローバル変数に格納します:

上記のすべてがスムーズに機能するようです。行うには

concat_1:  Munich :: Granny :: Williams :: RedDelight 
concat_2:  Amsterdam :: PinkLady :: Scrumptious 
concat_3:  Moscow :: Braeburn :: Williams :: RedDelight 

: - 次のステップでは、私は次の出力を(余分な区切り文字は、(「::」)これらのケースのために設定されていない空の値がちょうどスキップされていることに注意してください)を取得するために、個々の変数にしたいですこれは、私は次のコードを使用します。私はこのコードを実行すると

data _NULL_; 
    %do i = 1 %to 3; 
     call_symput("concat_&i",catx(" :: ", &&farm_&i., &&apples_&i.., &&pears_&i.., 
      &&cherries_&i.., &&plums_&i..)); 
    %end; 
run; 

はしかし、私はエラーを取得する:ここ

ERROR 159-185: Null parameters for CATX are invalid. 

私の仮定は、変数の一部を空にすることができますので、SASは不幸なことです値。しかし、どうすればこの問題を解決できますか?私は荷物をめちゃくちゃにしてしまって、ちょうど良い答えを見つけることができないようです。

+0

CATX()では、マクロ変数を引用符で囲む必要があります。今は問題を引き起こしているすべてのnullである変数名を探しています。 – Reeza

+0

Ps catx( '::'、農場の - プラム);最初からうまくいくはずです。 – Reeza

+0

マクロ変数でこの混乱が起こっているのはなぜですか?データステップを使用します。 – Joe

答えて

1

マクロ変数の値がMunichのように見えます。マクロが生成しているSASコードは、"Munich"のような文字列リテラルを生成する必要があります。それ以外の場合、SASはその名前の変数を探します。これはヌル値についてのエラーについても説明しています。ヌル値を文字列リテラルにするための引用符を使用しないと、隣接する区切り文字でCATX()コールが終了するためです。

data _NULL_; 
%do i = 1 %to 3; 
    call_symput("concat_&i",catx(" :: ", "&&farm_&i.", "&&apples_&i.." 
      , "&&pears_&i..", "&&cherries_&i..", "&&plums_&i..")) 
    ; 
%end; 
run; 

代わりにマクロ変数を引用符で生成することもできますが、その形式のマクロ変数としてはあまり有用ではないでしょう。したがって、最後の呼び出しsymput()ステートメントを変更する代わりに、マクロ変数を作成する前のものを変更することができます。また、そのステップから不要なマクロコードを削除することもできます。

data _NULL_; 
    set SAS_table; 
    call symput(cats("farm_",id), quote(farm)); 
    call symput(cats("apples_",id), quote(apples)); 
    call symput(cats("pears_",id), quote(pears)); 
    call symput(cats("cherries_",id), quote(cherries)); 
    call symput(cats("plums_",id), quote(plums)); 
run; 
+0

これは非常に意味があります。それに徹底的に答えていただきありがとうございます。コードは完全にこのように動作します。 – MRR

関連する問題