【问题标题】:Length of a SAS macro variable that contains quotes and commas包含引号和逗号的 SAS 宏变量的长度
【发布时间】:2018-04-19 17:21:06
【问题描述】:

设示例宏变量为

%let temp="A","B","C";

如何获得这个宏变量的数组长度,包括引号和逗号?例如,我想返回长度 3。

%let length_of_temp=%sysfunc(SOME_FUNC(&temp.));
%put length=length_of_temp;

LOG: length=3

最好我想使用一个已建立的 SAS 函数或代码行来完成,而不是创建一个新的处理函数。到目前为止,这是我尝试过的:

  • countw("&temp.",","):引号在尝试将其转换为字符串时会产生错误。

注意:由宏变量“TEMP”生成的行。 4
""A","B","C"

注意 49-169:带引号的字符串后面的标识符的含义在未来的 SAS 中可能会改变 释放。在带引号的字符串和后面的字符串之间插入空格 推荐使用标识符。

错误 388-185:需要算术运算符。

  • countw(&temp.,",")count(&temp.):函数调用的典型错误是参数太多
  • count((&temp.))dim((&temp.))
  • 上面使用%superq的变体

【问题讨论】:

  • 您是要计算 &temp 中的字符数(示例中为 11)还是引用字符串的数量(示例中为 3)?
  • 引用字符串的数量 - 编辑澄清

标签: sas sas-macro


【解决方案1】:

在您的宏变量值上使用宏引用,以便逗号不会对调用countw() 函数造成麻烦。使用qm 可选的countw() 函数的第三个参数,让它知道不计算引号内的分隔符。

%let temp="A1,a2","B","C";
%let count = %sysfunc(countw(%superq(temp),%str(,),mq));

如果您想在数据步骤中计算计数,则可以使用symget() 函数来检索宏变量的值,而不是宏引用。

count = countw(symget('temp'),',','mq');

【讨论】:

    【解决方案2】:

    这对我有用:

    %let temp="A","B","C";
    
    %let count = %sysfunc(countw("&temp", ","));
    %put Number of elements = &count.;
    

    结果:

    8002  %put Number of elements = &count.;
    Number of elements = 3
    

    【讨论】:

    • 你用的是什么版本?这会在日志中添加警告注释,并且仅在宏环境中工作时有效,例如数据步骤 DATA temp; c = countw("&temp.", ","); RUN;
    • @Anna 我建议,如果您希望问题包含数据步骤,您可能应该在问题中明确包含它。
    • @Anna 9.4M3 一个注释,不是错误,但该注释与宏变量有关,在元素之间没有空格而不是 COUNTW,我假设您此时已经意识到这一点您上面的代码将生成相同的注释。
    【解决方案3】:

    %quote 函数可能有助于屏蔽引号:

    %let count = %sysfunc(countw(%quote(&temp), ","));
    %put Number of elements = &count.;
    

    【讨论】:

    • 我认为这个答案具有误导性,至少这里没有更多信息。特别是,"," 并没有像新手想的那样做——在那种情况下,引号字符是字符,而不是标记,因此它们本身正在成为分隔符;将 temp 更改为 %let temp="A", "B", "C"; 你得到 5,而不是 3。
    • 另外,%quote 函数 有用的,但它对于屏蔽引号没有用,这里完全不相关 - 删除逗号,你不需要任何宏引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多