我有一个宏变量
%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提出的宏也有效,但由于我的变量中没有任何空格(我的数据集中不是城市,而是列名称),这个简单的解决方案已经足够了。
答案 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)
...