首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SAS宏调用中传递特殊字符(符号和连字符)

在SAS宏调用中传递特殊字符(符号和连字符)
EN

Stack Overflow用户
提问于 2021-06-11 16:31:50
回答 2查看 472关注 0票数 0

我使用一个SAS宏执行一个函数,其中一个输入参数来自SAS数据表,第二个参数(日期)是硬编码的,如下所示-

代码语言:javascript
复制
data _null_;
  set RTick.Co_list;
  call execute('%trade_participation(01012013,'|| scrip10 ||');');
run ;

这个宏看起来如下-

代码语言:javascript
复制
%macro trade_participation(date,scrip10);

data Trade_data (drop = time Record_ind segment series trade_no symbol trd_prc trd_q trade_time
buy_order_no buy_client_flg buy_algo_ind sell_order_no sell_client_flg sell_algo_ind);
    set Rttrade.Cash_trades_&date;

    if symbol = "&scrip10"; 
    if Record_ind = "RM";
    if segment = "CASH";
    if series = "EQ";
    time = trade_time/65536;
    time = time/3600;
    timeseqno = int((time-9)*60)+1;
    if timeseqno > 15;      
    if (buy_client_flg = 2)&((buy_algo_ind = 0)|(buy_algo_ind = 2)) = 1 then buy_HFT = 1;
    if (sell_client_flg = 2)&((sell_algo_ind = 0)|(sell_algo_ind = 2)) = 1 then sell_HFT = 1;
    trade_val = trd_prc*trd_q/100;
run;

/* more SAS code to do a bunch of other tasks to do on the subsetted 
file Trade_data */

修补%;

我现在面临的问题是,Co_list文件中的一些输入值(scrip10变量)具有特殊的字符,例如'bbbbbbM&M‘或'BAJAJ-AUTO’。一旦这些通过宏,它就失败了--“表面符号引用M未解析”。(对于第一个示例-bbbbbbM&M')

有人能提出解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-11 17:15:26

在您的特殊情况下,为什么不只是将实际引号包含在宏参数值中而不是将它们添加到宏中呢?

因此,更改宏定义:

代码语言:javascript
复制
if symbol = &scrip10 ; 

然后在代码生成步骤中添加引号。使用单引号,宏处理器将忽略任何&或%字符。

代码语言:javascript
复制
call execute(cats('%nrstr(%trade_participation)(01012013,',quote(scrip10,"'"),')'));

将宏调用( %trade_participation )封装在%nrstr()宏函数中将使您的SAS更易于阅读。示例:

代码语言:javascript
复制
+     %trade_participation(01012013,'bbbbbbM&M')
+     %trade_participation(01012013,'BAJAJ-AUTO')
票数 1
EN

Stack Overflow用户

发布于 2021-06-11 18:43:22

如果要执行宏引用路由,则必须执行两次%nrstr --因为它已经“解决”了两次,一次是在call execute执行其任务时,另一次是在宏内。

代码语言:javascript
复制
data have;
  input @1 callparam $10.;
  datalines;
abcdefghij
a&bc&de&fg
a%bc%de%fg
;;;;
run;

%macro showme(param=);
   data _null_;
    x = "&param";
    put x=;
   run;
%mend showme;

options mprint symbolgen;
data want;
  set have;
  paramstr = cats('%nrstr(',callparam,')');
  callstr = cats('%nrstr(%showme(param=',paramstr,'))');
  call execute(callstr);
run;

但是,这并不适用于一个特殊情况:变量中的引号。必须通过加倍(' -> '')或其他几个选项(比如%quote块内的%' )来解决这个问题。

一般来说,这不是一种很好的做事方式。这是参数和宏语言的缺点--太容易陷入混乱。相反,如果我这样做,我可能会从宏中的数据中提取值。这就避免了大部分这些问题。也许可以创建一种格式。或者使用DOSUBL和/或RUN_MACRO,这两种方法都允许您在不需要执行相同步骤的情况下完成这些操作。或者一次完成所有的操作,不要试图对每个符号进行分割。有很多方法可以避免宏语言(宏语言往往被过度使用),而且通常也更快!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67940543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档