2015-12-09 1 views
0

Я отлаживаю макрос, который я пишу, который обрабатывает строку как префикс или суффикс имени набора данных на основе ввода пользователем. Затем цитируемый результат будет передаваться в другой процесс вниз по течению.SAS Macro Variable Quoted Concatenation

Так что, если пользователь говорит Type = 1 и предоставляет строку «data_», результат результирующей макропеременной будет «data_%».

Я пробовал несколько разных итераций приведенного ниже кода, но не могу получить его ... любая помощь будет принята с благодарностью. Благодарю.

%let Type=1; 
%let TableName=data_; 

data _null_; 
    if &Type=1 then 
     call symput('qTableName',%unquote(%str(%')(cats(&TableName.,"%"))%str(%'))); 
    else if &Type=2 then 
     call symput('qTableName',%unquote(%str(%')(cats("%",&TableName.))%str(%'))); 
run; 

%put &qTableName; 
+1

Поскольку вы используете шаг данных, почему вы также используете все эти макрофункции? 'call symputx ('qtablename', cats (symget ('TableName'), '_%'))'. Также являются ли отдельные кавычки частью значения в сгенерированной макропеременной или нет? – Tom

ответ

3

Похоже, вы пытаетесь добавить одинарные кавычки к макропеременной.

%let TableName=data_; 
%let qTableName='data_%'; 

Таким образом, в шаге данных вы можете использовать CATQ().

data _null_; 
    call symputx('qTableName',catq('1a',cats(symget('TableName'),'%'))); 
run; 

Или в простом коде макроса просто использовать %bquote(), чтобы позволить вам добавить ' и % без предупреждения макрораскрытия переменного. Но вы, вероятно, захотите удалить макрокоманду, вызывающую ее.

%let qTableName=%unquote(%bquote('&TableName%')); 

Или, если вы хотите только добавить % когда & TYPE = 1, то, возможно, вы могли бы вызвать функцию IFC(). Я считаю, что вызов %sysfunc() удалит макрокоманду.

%let Type=1; 
%let qTableName=%sysfunc(ifc(&type=1,%bquote('&TableName%'),%bquote('&TableName'))); 
+0

Спасибо, Том. Решение, которое вы предоставили на шаге данных, отлично работает для моих нужд. – pyll