2016-12-11 21 views
0

データセット内の変数名に接尾辞を追加するマクロを作成したいとします。SAS:データセット内の変数に接尾辞を追加するマクロを作成する

NOTE: No rows were selected. 
NOTE: PROCEDURE SQL used (Total process time): 
     real time   0.00 seconds 
     cpu time   0.00 seconds 


WARNING: Apparent symbolic reference RENAME_LIST not resolved. 
NOTE: Line generated by the invoked macro "ADD_SUFFIX". 
2             rename &rename_list;  run; 
                 - 
                 22 
                 76 
NOTE: Enter RUN; to continue or QUIT; to end the procedure. 

ERROR 22-322: Expecting a name. 

ERROR 76-322: Syntax error, statement will be ignored. 

私は引用符でライブラリやデータセットの名前を入れた場合、それはつまり、文字列rename_listではなく、に値を追加する最初のブロックのために働く:

%macro add_suffix(library=,dataset=,suffix=); 
    proc sql noprint; 
     select cat(name, ' = ', cats('&suffix.',name)) into :rename_list separated by ' ' from 
     dictionary.columns where libname = '&library.' and memname= '&dataset.'; 
    quit; 

    proc datasets library=&library nolist nodetails; 
     modify &dataset; 
     rename &rename_list; 
    run; 

    quit; 

%mend; 
%add_suffix(library=OUTPUT,dataset=CA_SPREADS,suffix=CA); 

それはエラーメッセージを与える:以下の私のコードですあなたは、単一引用符'ではなく、二重引用符"でそれらをラップしているので、procのデータセットのステップのために

+0

プレフィックスに名前を追加しようとしているようです。 – Tom

+0

ここでは考慮しませんが、名前が32文字以下であることを確認する必要があります。リネーム部分については、私自身CATXが好きですが、それは読みやすいです。 https://gist.github.com/statgeek/82d9f2854edc01560e0f – Reeza

答えて

2

%&のようなマクロトリガーは、一重引用符では受け入れられません。そのため、あなたはSQLクエリにヒットしていません。最初の文字として&を持つライブラリ名はありません。

それは一種の仕事をしていたように見えた理由は、あなたのSQL文でこれを使用する場合

catx('=',name,cats('&prefix.',name)) 

は、あなたが

age=&prefix.age 

のような文字列で終わるそして、それが実際にするということですRENAMEステートメントを実行すると、マクロ変数PREFIXへの参照が解決されるため、問題が発生します。

代わりに二重引用符を使用してください。

%macro change_names(library=,dataset=,prefix=,suffix=); 
%local rename_list; 
proc sql noprint; 
    select catx('=',name,cats("&prefix",name,"&suffix")) 
    into :rename_list separated by ' ' 
    from dictionary.columns 
    where libname = %upcase("&library") 
    and memname = %upcase("&dataset") 
    ; 
quit; 

%if (&sqlobs) %then %do; 
proc datasets library=&library nolist nodetails; 
    modify &dataset; 
    rename &rename_list; 
    run; 
quit; 
%end; 
%else %put WARNING: Did not find any variables for &library..&dataset..; 
%mend change_names; 

%change_names(library=OUTPUT,dataset=CA_SPREADS,prefix=CA); 
1
  1. あなたのマクロ変数が解決されていません。
  2. マクロのlibnameとmemnameのパラメータは大文字である必要があります。これらは常に大文字のdictionary.columnsです。
1

テスト済みで動作します。長いが、多分初心者フレンドリーなアプローチ。データセット名と追加するサフィックスを入力します。

例:%add_suffix(orders、_old);/*すべての変数に_oldサフィックスを追加します*/

%macro Add_Suffix(Dataset, suffix); 
    proc contents noprint 
     data=work.&dataset out=sjm_tmp(keep=NAME); 
    run; 

    data sjm_tmp2; 
     set sjm_tmp; 
     foobar=cats(name, '=',NAME,'&suffix.'); 
    run; 

    proc sql noprint; 
     select foobar into :sjm_list separated by ' ' from sjm_tmp2; 
    quit; 

    proc datasets library = work nolist; 
     modify &dataset; 
     rename &sjm_list; 
    quit; 

    proc datasets library=work noprint; 
     delete sjm_tmp sjm_tmp2 ; 
    run; 
%mend Add_Suffix; 
関連する問題