SAS宏变量引用

时间:2017-02-23 21:01:57

标签: sas sas-macro

我有一个宏变量

%let data =london paris;

真正的变量是由sql制作成的,并且会有所不同。我想要的是什么 做的是创建一个新的宏变量datalist,如下所示:

('london' , 'paris')

我将在statment(old是包含城市变量的表)中使用它:

data new;
   set old;
   where city in &datalist;
run;

我试图以下面的丑陋方式制作这个变量:

%let data =london paris;
%let datalist =  (%str(%')%sysfunc(tranwrd(&data,%str( ),%str(%' ,    %')))%str(%')); 
%put &datalist;

但是当我运行此代码时,我收到以下错误消息:

10   %let data =london paris;
11   %let datalist =  (%str(%')%sysfunc(tranwrd(&data,%str( ),%str(%' , %')))%str(%'));
NOTE: Line generated by the macro function "SYSFUNC".
1    london' , 'paris
           -----
           49
NOTE 49-169: The meaning of an identifier after a quoted string might change in a future SAS
             release.  Inserting white space between a quoted string and the succeeding
             identifier is recommended.
12   %put &datalist;
NOTE: Line generated by the macro variable "DATALIST".
1     ('london' , 'paris')
              -----
              49
('london' , 'paris')
NOTE 49-169: The meaning of an identifier after a quoted string might change in a future SAS
             release.  Inserting white space between a quoted string and the succeeding
             identifier is recommended.

真正奇怪的是,如果我输入%unqote:

,我可以使用此变量
data new;
   set old;
   where city in %unquote(&datalist);
run;

但我仍然有此错误消息。有没有更好的方法将数组变量更改为:

paris london - > (' paris',' london')

解 Quentin提出的简单解决方案实际上解决了我的问题

where findw("&datalist",trim(city)) ;

但是Quentin提出的宏也有效,但由于我的变量中没有任何空格(我的数据集中不是城市,而是列名称),这个简单的解决方案已经足够了。

2 个答案:

答案 0 :(得分:2)

我是Richard DeVenezia的%seplist实用程序宏的忠实粉丝:http://www.devenezia.com/downloads/sas/macros/index.php?m=seplist。我在我的个人库中对其进行了修改,以生成最后一个语句%unquote(&emit)而不是&emit。 有了它,你可以编码:

where city IN (%seplist(&datalist,nest=Q)) ;

nest=Q在列表中的每个项目周围添加单引号。

那就是说,另一个选择是使用FINDW,这会让你需要引用每个项目,即:

where findw("&datalist",trim(city)) ;

答案 1 :(得分:1)

基于TRANWRD()函数使用此方法的最大问题是,您需要确保空格分隔列表在单词之间只有一个空格。但是既然你用PROC SQL生成它就应该没问题。如果是手动输入,则添加对COMPBL()的调用以清理源字符串。

您可以使用宏引用创建字符串,然后删除宏引用。

%let data =london paris;
%let qlist=%qsysfunc(tranwrd(&data,%str( ),%bquote(',')));
%let qlist=(%unquote(%bquote('&qlist')));

或者您可以使用双引号创建字符串,然后将双引号反转为单引号。

%let data =london paris;
%let qlist=("%sysfunc(tranwrd(&data,%str( ),%bquote(",")))");
%let qlist=%sysfunc(translate(&qlist,'"',"'"));

当然,如果您没有使用空格分隔版本,那么只需在PROC SQL中直接生成引用版本。您可以稍后添加()

select quote(trim(city),"'") into :data separated by ',' ...
...
where city in (&data)
...
相关问题