【问题标题】:A character operand was found in the %EVAL function or %IF condition在 %EVAL 函数或 %IF 条件中找到字符操作数
【发布时间】:2015-10-07 16:43:28
【问题描述】:

/* 这是有问题的代码*/

%macro numstats(var = ,file=, format=);
  %let dsid=open(&file.,i);
  %if %LENGTH(&var.) > 8 AND %VARTYPE(&dsid.,%VARNUM(&dsid.,&var.))='N' %then %do;
     Proc SQL;
       SQL code
     quit;
  end;
%mend numstats;

运行此代码时出现以下错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。

我已广泛使用此代码以尝试不同的在线解决方案,但无法弄清楚为什么我仍然收到此问题。请帮忙!

  • 旁注:我必须添加此IF 语句的原因是试图找出该变量是否为日期变量。我所有的日期变量都是Date9.,所以如果它是数字并且长度大于8,那么我想添加我不会添加到常规数字变量的日期格式。如果有人能想到更简单的方法来做到这一点,那么我也愿意,但请帮我找出这个错误!

【问题讨论】:

  • 您尚未定义宏 %VARTYPE 和 %VARNUM。他们在做什么?
  • 您使用 %LENGTH() 函数调用获取具有变量名称的字符串的长度。不是变量的定义长度。
  • 数字变量的最大长度为 8。您似乎是在说要测试附加到变量的已定义格式的长度。所以如果 DOB 有 DATE9。作为其附加格式,那么长度可能是 8,但格式长度是 9。
  • @Tom 我认为我需要使用 %VARTYPE 与 VARTYPE,就像我必须使用 %IF 与 IF 一样。这个概念对我来说是新的,也是我以前不知道的。所以,即使我调用宏变量(&file/&var),我也可以简单地使用 VarType 和 VarNum?
  • @Tom 另外,您想测试格式长度是对的。你知道调整代码来做到这一点的方法吗?谢谢。

标签: sas enterprise-guide


【解决方案1】:

如果您想在宏代码中调用数据步进函数,那么您需要使用 %SYSFUNC() 宏函数来调用它们。下面是一个宏函数示例,可以为您执行此操作。

%macro varinfo
/*----------------------------------------------------------------------
Retrieve attribute of a specified variable.
----------------------------------------------------------------------*/
(ds        /* Data set name */
,var       /* Variable name */
,info      /* information attribute to return - Default is NUM */
);
/*----------------------------------------------------------------------
Example values for INFO parameter:
 NUM = variable number
 LEN = length of variable
 FMT = format of variable
 INFMT = informat of variable
 LABEL = label of variable
 TYPE  = type of variable (N for numeric, C for character)
------------------------------------------------------------------------
Usage Examples:

%if %varinfo(&data,NAME)
 %then %put input data set contains variable NAME;

%put Variable &column in &data has type %varinfo(&data,&column,type);
------------------------------------------------------------------------
Notes:

The macro call resolves to 0 when either the data set does not exist
or the variable is not in the specified data set. 
Invalid values for the INFO parameter generate a SAS ERROR message.
----------------------------------------------------------------------*/
%local dsid rc varnum;
%let dsid = %sysfunc(open(&ds));
%if (&dsid) %then %do;
  %let varnum = %sysfunc(varnum(&dsid,&var));
  %if (&varnum) & %length(&info) %then
    %sysfunc(var&info(&dsid,&varnum))
  ;
  %else
    &varnum
  ;
  %let rc = %sysfunc(close(&dsid));
%end;
%else 0;
%mend varinfo;

使用这个你的宏可能会变成这样:

%macro numstats(var = ,file=, format=);
   %if %varinfo(&file,&var,type)=N and
       DATE = %sysfunc(substrn(%varinfo(&file,&var,fmt),1,4))
   %then %do;
     * do something ;
   %end;
%mend numstats;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    相关资源
    最近更新 更多