2012-04-05 2 views
1

я учусь SAS и писать этот макрос:SAS макросы: Странное поведение котировок

%macro firstMacro(mvLO, OLO); 
    %local Count; 
    %local Wordy; 
    %local Resty; 
     %let Resty = ''; 
     %let Count = %sysfunc(count(&OLO, %str())); 
     %let Wordy = %sysfunc(scan(&OLO, 1 ,%str())); 
     %let Wordy = "&Wordy"; 
     %let Resty = &Wordy; 
     %put &Resty; 
     /*strange behavior here*/ 
    %DO I=2 %TO &Count+1;  
     %let Wordy = %sysfunc(scan(&OLO, &I ,%str())); 
     %let Wordy = "&Wordy"; 
     %put Wordy is; 
     %put &Wordy; 
     %let Resty = %sysfunc(cats(&Resty, %str(,), &Wordy)); 
     %put &Resty; 
    %END; 
     %put FINAL OUT; 
     %put &Resty;   
    %mend firstMacro; 

и назвав его:

%firstMacro(mvLO=WORK, OLO=field_1 field_2 field_3); 

и увидеть этот вывод:

FINAL OUT 
    "field_1""field_2","field_3 

поэтому, я спрашиваю SAS: , почему вы едите запятую (,) между field_1 и field_2?

+0

Можете ли вы сказать, что вы» re пытается сделать с этим макросом? – sasfrog

+0

да, я пытаюсь сделать это: '" field_1 "," field_2 "," field_3 "'. После этого макроса я могу использовать эту строку для IN-clause в Where in macro. Когда я пытаюсь использовать строку без кавычек 'field_1, field_2, field_3' в макросе в WHERE с IN, я получаю ошибку – gaussblurinc

+0

Эта строка'% DO I = 2% TO & Count + 1; 'является виновником, я думаю. Попробуйте '% DO I = 2% TO% EVAL (& count + 1);' –

ответ

1

Я думаю, что если заменить этот

%let Resty = %sysfunc(cats(&Resty, %str(,), &Wordy)); 

с этим

%Let RESTY=&resty %str(,) &wordy; 

он будет работать (по крайней мере, с вызовом образца)

1

Поскольку вы пытаетесь узнать SAS. Вот более короткий макрос, чтобы делать то же самое.

%macro firstMacro(mvLO, OLO); 
    %local str1 str2 str3; 
    %let str1=%sysfunc(strip(%sysfunc(compbl(&OLO)))); 
    %let str2=%sysfunc(transtrn(&str1,%str(),%str(,))) ; 
    %let str3=%sysfunc(catq(2csa, &str2)); 
    %put &str3; 
%mend firstMacro; 
%firstMacro(mvLO=WORK, OLO=field_1 field_2 field_3); 

В журнале

"field_1","field_2","field_3" 
0

Если вы хотите петли (и кто не делает):

%macro firstMacro(mvLO=, OLO=); 

    %* Note we dont need to make those macrovariables local in a macro - they; 
    %* should be local to the macro unless you specifically make them global; 

    %* Get a counter started ; 
    %let i = 1; 

    %* Initiate your new string to be empty; 
    %let resty = ; 

    %* Loop over your inputs until there are none left *; 
    %do %until(%scan(&OLO, &i) =);  

     %* Add the quotes and the comma; 
     %let resty = &resty "%scan(&OLO, &i)", ; 

     %* Update the counter; 
     %let i = %eval(&i + 1); 
    %end; 

    %* Get rid of that trailing comma; 
    %let resty = %substr(%nrbquote(&resty, 1, %eval(%length(&resty) - 1)); 

    %* Output to the log; 
    %put &resty; 
%mend; 
0

Использование qsysfunc вместо sysfunc

+1

, пожалуйста, уточните – Daenarys