sas - 从数据集中的字符串执行 SAS 代码

标签 sas sas-macro

是否可以读取(和执行)存储在 SAS 数据集中字符串中的 SAS 代码。

例如,数据集 'CODE' 包含一个字符串变量,其中包含

"IF TOTAL_SALES GE 20000 AND TYPE IN ('A', 'B', 'C') THEN VAR1 = 'Y' ;"

我可以做类似的事情吗?
data sales ;
set sales ;
/* run the if statement above */
run ;

使用 SAS 9.2

最佳答案

有很多方法可以做到这一点,因为有很多方法可以构造宏变量。通常最有用的三个:

proc sql select into

这允许您立即创建多行代码,并且可能是用于此目的的最常用工具。它可以直接创建代码行,或者更有用地创建宏调用。例如,假设您想运行:

data want;
set have;
x = sum(a,b,c);
run;

但是 x,a,b,c 都定义在另一个数据集中。此外,您有 3 个这样的变量。
data callset;
input var1 $ var2 $ var3 $ var4 $;
datalines;
x a b c
y d e f
z b e c
;;;;
run;

你可以这样构造它:
proc sql;
select cats(x,"=sum(",a,",",b,",",c,");") into :calllist
 separated by ' '
 from callset;
quit;

data want;
set have;
&calllist.
run;

但是,构造宏可能更容易:
%macro sum(var1,var2,var3,var4);
&var1. = sum(&var2.,&var3.,&var4.);
%mend sum;

然后你的 PROC SQL 更容易一些(在这种情况下不是真的,但这通常有助于更复杂代码的可读性):
proc sql;
select cats('%sum(',catx(',',x,a,b,c),')') into :calllist
 separated by ' '
 from callset;
quit;

然后以同样的方式使用它。

这里的限制:除了 PROC SQL 允许你做的事情(这是强大的,但不是 datastep 代码,如果你需要使用像 first.var 这样的东西,你必须在proc sql 在一个单独的步骤中)。宏变量中总共有大约 20k 个字符的限制。
separated by顺便说一句,很重要;没有它,您只能创建一行代码(只有最后一行会被放入宏变量中)。即使你真的不希望它被任何东西分隔,你仍然需要用“”分隔以生成列表。

%include 文件

包含文件方法是 proc sql 方法和调用 execute 的混合体。它是在数据步骤中构建的,并且没有超出操作系统文件大小限制的长度限制。然而,它有点困惑(因为创建了一个临时文件)并且具有包含文件的正常限制,例如不包含数据线。

您以这种方式构建它(使用以前的数据集):
filename toincl temp; *create temporary fileref;
data _null_;
set callset;
file toincl;
callstr = cats('%sum(',catx(',',x,a,b,c),')');
put callstr $;
run;

data want;
set have;
%include toincl;
run;

它绕过了 PROC SQL 长度限制,但具有包含文件的正常限制(有关更多信息,请参阅 the documentation)。

调用执行

这用于在数据步骤之后立即以交互方式执行一行代码。它很方便,因为它允许您比其他方法更灵活地即时构建代码,但它具有显着的时间限制。
data _null_;
set callset; *this is not the main data set, but the control file with SAS code;
call execute('data want; set have;');
callstr=cats('%sum(',catx(',',x,a,b,c),')');
call execute(callstr);
call execute('run;');
run;

人们通常遇到麻烦的主要限制是宏变量计时。当宏变量在 CALL EXECUTE 步骤中定义时,它不能在同一个 CALL EXECUTE 步骤中使用。因此,如果您的代码包含要创建然后使用宏变量的代码,它将无法正确运行;您需要使用其他方法之一。如果您使用这种方法,我强烈建议您阅读一些关于 CALL EXECUTE 的论文,例如 this onethis one第一的。

关于sas - 从数据集中的字符串执行 SAS 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943697/

相关文章:

sas将表格插入html电子邮件

SAS - 使用另一列的值动态创建列名

r - 如何在R中读取大型SAS数据

sql - 在 SAS 的 Proc SQL 中使用宏变量

SAS:如何知道哪个宏称为当前宏?

sas - 将带空格的字符串转换为有效的表名

variables - 通过数据步骤的 SAS 变量串联

sas - 如何计算 SAS 中宏变量的数据类型

sas - 刷新 PDV 变量

sql - 多个 WHERE IN 必须保持分离