我想使用以下语法
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.;
已经尝试使用STR() - 函数但到目前为止没有成功。
答案 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系统选项关闭有关引用字符串长度的警告,但在此应用程序中您不希望这样,因为单个引用的字符串不会那么长。
如果需要这么长的列表,您将更好地使用其他方法来对数据进行子集化。