SAS:使用引号创建字符串列表作为输入过滤的宏变量

时间:2015-08-25 13:23:54

标签: 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 "',' "
   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 "','"

它不会给我一个错误信息,但是当看到宏变量时,会出现多行红色数字(通常表示错误信息的颜色),空行,减号,....以下屏幕截图显示了运行此代码后的部分日志:

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

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

如果需要这么长的列表,您将更好地使用其他方法来对数据进行子集化。