【问题标题】:CALL SYMPUT a character operand was found in the %EVAL functionCALL SYMPUT 在 %EVAL 函数中找到一个字符操作数
【发布时间】:2019-09-26 10:29:56
【问题描述】:

我目前正在尝试创建一个宏,它将字符串的一部分设置为全局变量列表,其中字符串的各个部分由“-”分隔,例如,672-46-246 将生成三个全局变量、name2、name2、name4,分别称为672、46、246。还有一个 name1 是整个字符串的全局变量。但无论如何,我有能力将整个字符串放到一个全局变量中,但我在拆分它时遇到了麻烦。可能还有其他方法可以做到这一点,但我正在尝试做一个 for 循环来确定有多少“拆分”,即“-”,然后通过这些拆分对其进行子串化。现在我正在尝试找出有多少“拆分”,但代码正在返回

错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。条件是: &拆分。

不确定摘要中还包括什么。

代码如下

%GLOBAL C;
%LET C=1;
DATA _NULL_;
    SET T_&scope.;
    %DO I = 1 %TO &sqlobs.;
        %GLOBAL name&C.;
        CALL SYMPUT("name&C.", COL&I.);
        %Counter(C);
        CALL SYMPUT("splits", COUNTC(COL&I., "-"));
        %DO J = 0 %TO &splits.;
            %Counter(C);
        %END;
    %END;
RUN;

警告:未解决明显的符号引用拆分。 错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。条件是: &拆分。

【问题讨论】:

  • 请清楚地表明您的输入是什么以及您想要什么作为输出。目前还不清楚您要做什么。如果您从宏变量开始,请显示 %LET 语句来分配初始值。如果您的输出是宏变量,则显示 %LET 语句来演示给定输入的预期输出。如果输入或输出是数据集,则显示创建数据集的数据步骤。
  • 设置宏变量列表通常不是很有帮助。为什么不将单个宏变量中的值保留为分隔字符串并根据需要提取每个值?

标签: macros sas


【解决方案1】:

不确定问题是什么,但错误的原因是您在给它一个值之前尝试使用宏变量SPLITS。宏处理器首先运行,然后生成的代码由 SAS 编译和运行。因此,您的 %do j=0 %to &splits; 宏语句在您的数据步骤开始运行之前进行评估,因此肯定在 CALL SYMPUT() 语句可以运行之前进行评估。

如果您有一个宏变量中的值列表,请使用%SCAN() 来挑选各个值。

%let list= 672-46-246 ;
%do i=1 %to %sysfunc(countw(&list,-));
  %let next=%scan(&list,&i,-);
  ...
%end;

【讨论】:

  • 这绝对比我用 countc 和所有那些胡言乱语的东西更优雅,但它仍然遇到问题,当我做 sysfunc(countw(col&I., -)); 时,它将 col1、col2、col3 视为单独的字符串,而不是我想要的变量。我会想办法让它保持原样,然后如果我想出一种更好的方法而不用搞砸所有这些,就更新。
  • 这就是为什么我说不要将数据放入一系列宏变量中。要将变量 I 用作宏变量的 NAME 的尾部并获取宏变量的 VALUE,您需要添加额外的 &。 %let i=1; %put Value of col&i is "&&col&i";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多