宏块或数据步之外的 SAS 宏函数

SAS macro functions outside of macro block or data step

我在掌握在 SAS 中使用函数时遇到问题,语法令人困惑。

我正在尝试获取最后没有日期的姓名。例如,我有这样的东西:“MODEL_NAME_202101”,我想要“MODEL_NAME”。

我就是这样做的。

%let model_ds = 
%sysfunc(
    substr(
        %scan(&models_list, 12), 
        0, 
        %length(%scan(&models_list, 12)) - 7
    )
);

%put &model_ds;

我唯一得到的是一个交战,没有告诉我我正在犯的语法错误。

WARNING: Argument 2 to function SUBSTR referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range.

不知道我应该如何嵌套函数调用。是否每个调用都需要在调用之前有 %sysfunc,或者在 %sysfunc 中已经调用的函数中嵌套函数语法正确。

如果有人可以向我推荐此特定“功能”的 explanation/documentation,那就太好了,

谢谢

为什么要在这里使用 %scan 功能?另外,还有%substr,所以需要用到%sysfunc。请参阅下面的代码:

  %let models_list=MODEL_NAME_202101;
  %let model_ds = %substr(&models_list,1,%eval(%length(&models_list)-7));
  %put &model_ds;

这是您要找的吗?

关于最适合您的解决方案的节奏可能是正确的 - 但具体错误:

WARNING: Argument 2 to function SUBSTR referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range.

这是因为:

substr(...,0,...)

第二个参数是“从什么位置开始”。 SAS 是基于 1 的,而不是基于 0 的(您最初是 python 开发人员吗?这可能有点挑战!),因此它永远不能低于 1。

substr(...,1,...)