SAS:创建带引号的字符串列表作为输入筛选的宏变量

SAS:创建带引号的字符串列表作为输入筛选的宏变量,sas,Sas,我想使用以下语法 data new; set old (where=(mystring in ('string1','string2',...,'string500'))); run; 以过滤非常大的输入数据集。500个字符串首先作为数值包含在数据集“aux”的变量“bbb”中。到目前为止,我已经创建了一个宏变量,其中包含500个字符串的所需列表,方法如下: proc sql noprint; select bbb into :StringList1 separated by "'

我想使用以下语法

data new;
   set old (where=(mystring in ('string1','string2',...,'string500')));
run;
以过滤非常大的输入数据集。500个字符串首先作为数值包含在数据集“aux”的变量“bbb”中。到目前为止,我已经创建了一个宏变量,其中包含500个字符串的所需列表,方法如下:

proc sql noprint;
   select bbb into :StringList1 separated by "',' "
   from work.aux; 
quit;
data _null_; call symputx('StringList2',compress("'&StringList1'")); run; 

data new;
   set old (where=(mystring in (&StringList2)));
run;
。。。这似乎有效。但是有一个警告告诉我

当前正在处理的带引号的字符串已超过262个 字符长。您可能有不平衡的引号

结果似乎仍然可信。我是否应该担心有一天结果可能会出错

更重要的是:我试图通过设置

separated by "',' "
选项的方式首先不包含空格。不幸的是,以下情况似乎不起作用:

separated by "','"
它没有给我一个eror消息,但是当查看宏变量时,有一个多页混乱的红线数字(通常表示错误消息的颜色)、空行、减号等等。以下屏幕截图显示了运行此代码后的部分日志:

proc sql noprint;
   select vnr into :StringVar1 separated by "','"
   from work.var_nr_import;
quit;
%put &StringVar1.;


已尝试使用STR()-函数,但到目前为止没有成功。

我无法在SAS 9.3中复制您的错误消息

如果变量是数字,则宏变量中不需要引号

如果是字符,请尝试使用QUOTE()函数

 proc sql noprint;
 select quote(bbb) into :StringList1 separated by " "
 from work.aux; 
 quit;

宏变量只能包含65534个字符。因此,如果BBB的值太多,则宏变量值将被截断。这可能导致报价不平衡。这很可能是您错误的根源

请注意,您可以通过使用NOQUOTELENMAX系统选项来关闭有关引用字符串长度的警告,但在此应用程序中,您不希望关闭,因为单个引用字符串没有那么长


如果需要这么长的列表,最好使用另一种方法对数据进行子集

嗯,我用我的一个表测试了你的代码,表之间用“,”(不带空格)隔开,没有错误,你有什么错误信息或行为?刚刚在主要帖子中添加了一些相关细节。谢谢,还没听说quote函数。这很好,很实用!!此外,上面显示的错误消息可能确实是由于SAS9.3的未修补版本造成的。。