0

これが私が書いているマクロです。特定のデータセットを見て、各フィールド(列)名を観察として情報データセットに書き込みたいと思います。

これが私が持っているものです

%macro go_macro(data);


/*get the list of field names from the dictionary*/
proc sql noprint;

    select distinct name into :columns separated by ' '
    from dictionary.columns
    where memname = "%upcase(%scan(&data, -1))" and libname = "%upcase(%scan(&data, 1))" and type = "char"
;

quit;

/*now loop through this list of fieldnames*/
%let var_no = 1; 
%let var = %scan(&columns, &var_no, ' '); 

%do %while (&var ne);

                 /*here is where I want to write the fieldname to an observation*/
    fname = "&var"; 
                 output; 


%let var_no = %eval(&var_no +1);
%let var = %scan(&columns, &var_no, ' '); 
%end;

%mend;


/*execute the code*/
data bdqa.accounts_info; 
%go_macro(braw.accounts)
run;

これは私に与えます

[MPRINT] Parsing Base DataServer
/* 0005 */      fname = "SORT_CODE"; 
/* 0006 */          output; 
/* 0009 */      fname = "BANK_NAME"; 
/* 0010 */          output; 
/* 0013 */      fname = "CREDIT_CARD"; 
/* 0014 */          output; 
/* 0017 */      fname = "PRIMARY_ACCT_HOLDER"; 
/* 0018 */          output; 
/* 0021 */      fname = "account_close_date"; 
/* 0022 */          output;
/* 0023 */      run;


    ERROR: Parsing exception - aborting
ERROR: DS-00274 : Could not parse base DataServer code: Encountered " <ALPHANUM> "fname "" at line 5, column 9.
Was expecting one of:
    <EOF> 
    ";" ...
    "*" ...
    "data" ...
    "proc" ...
    (and 9 more)
    while

その間

data mytest;

    do i = 1 to 5; 
    fname = 'hello world';
    output; 
    end;
    keep fname; 
run;

完全に合法です。

次のコード

%macro char_freqs(data=);

/*get the different variables*/
proc sql noprint;

select distinct name into :columns separated by ' '
from dictionary.columns
where memname = "%upcase(%scan(&data, -1))" and libname = "%upcase(%scan(&data, 1))" and type = "char"
;

quit;

/*now get the distinct values for each of the variables*/
%let var_no = 1; 
%let var = %scan(&columns, &var_no, ' '); 

%do %while (&var ne);

    proc freq data=&data; 
    tables &var/out=&var._freq; 
    run;    

%let var_no = %eval(&var_no +1);
%let var = %scan(&columns, &var_no, ' '); 
%end;

%mend;


%char_freqs(data=macros.businesses)

また動作します - PROC FREQ が許可されます。

4

1 に答える 1

3

問題は、次のようなものがあることです。

data bdqa.accounts_info; 
%go_macro(braw.accounts)
run;

->

data bdqa.accounts_info; 
proc sql;
... select stuff ...;
quit;
fname = "stuff"; ...
run;

必要なもの:

proc sql;
select stuff;
quit;


data bdqa.accounts_info; 
 fname = "stuff";
 ...
run;

マクロから PROC SQL を削除する必要があります。マクロの外部でマクロ変数を作成できます。正直なところ、これにはマクロをまったく使用しないでください。次の 2 つのいずれかを行うことができます。 a) DICTIONARY.COLUMNS から直接テーブルを作成します。

proc sql;
create table bdqa.accounts_info as select name as fname from dictionary.columns where ... ;
quit;

b)データステップで作成します

data bdqa.accounts_info;
__data = "&var_no";
do ... ;
run;

(do ループは基本的にマクロの %do ループと同じです)

于 2013-01-29T16:03:43.417 に答える