SAS Call Execute返回带有点而不是变量内容的字符串

时间:2017-08-03 20:58:38

标签: sas

我有以下代码:

%MACRO CALCU(DATE_VAR);
%get_filenames('./subgroup/groups',filenames);
data _null_;
        set filenames;
        by fname;
        %put go;
        if fname =: "&TIME_INTERVAL";
        call execute(cats('%nrstr(%ACTUAL_CAL)(',&DATE_VAR,',',fname,')'));
run;
%mend;

当我这样称呼时:

%CALCU(cq2014);

被调用的字符串实际上是

%ACTUAL_CAL(.,MINUTE15_group0.csv)

而不是%ACTUAL_CAL(cq2014,MINUTE15_group0.csv)

我想知道为什么会这样?是不是在cat语句中不能使用宏变量?

2 个答案:

答案 0 :(得分:0)

似乎我不应该让猫变成宏变量。相反,我应该这样做:

call execute(cats('%nrstr(%ACTUAL_CAL)(&DATE_VAR,',fname,')'));

答案 1 :(得分:0)

SAS宏处理器主要只是进行简单的文本替换。如果你写这行代码:

call execute(cats('%nrstr(%ACTUAL_CAL)(',&DATE_VAR,',',fname,')'));

&DATA_VAR将被其值替换。所以你得到这行SAS代码。

call execute(cats('%nrstr(%ACTUAL_CAL)(',cq2014,',',fname,')'));

因此cats()函数的第二个参数是名为cq2014的变量。因此,变量cq2014的值将用于生成要传递给call execute()的字符串。如果先前没有定义变量,那么SAS将使用该名称创建一个新变量,并且它将在数据步骤中为所有观察值保留缺失值。

您应该在日志中看到一条说明cq2014未初始化的说明。

因此,您可以使用双引号将宏变量评估为数据步骤中的字符串文字。

call execute(cats('%nrstr(%ACTUAL_CAL)(',"&DATE_VAR,",fname,')'));

或者使用单引号,当调用execute()将字符串推送到数据步骤结束后运行的命令堆栈上时,将对其进行求值。

call execute(cats('%nrstr(%ACTUAL_CAL)(&DATE_VAR,',fname,')'));