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

时间:2021-06-11 16:31:50

标签: sas sas-macro

我正在使用 SAS 宏来执行一个函数,其中一个输入参数来自 SAS 数据表,第二个参数(日期)是硬编码的,就像这样-

data _null_;
  set RTick.Co_list;
  call execute('%trade_participation(01012013,'|| scrip10 ||');');
run ;

宏如下-

%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')

有人可以提出解决方法吗?

2 个答案:

答案 0 :(得分:1)

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

因此更改宏定义:

if symbol = &scrip10 ; 

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

call execute(cats('%nrstr(%trade_participation)(01012013,',quote(scrip10,"'"),')'));

将宏调用 %trade_participation 包装在 %nrstr() 宏函数内部将使您的 SAS 日志更易于阅读。示例:

+     %trade_participation(01012013,'bbbbbbM&M')
+     %trade_participation(01012013,'BAJAJ-AUTO')

答案 1 :(得分:0)

如果您要执行宏引用路由,则必须 %nrstr 两次 - 因为它已“解析”两次,一次是在 call execute 执行其操作时,一次是在宏内部。< /p>

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 两者都可以让您无需太多步骤即可完成此操作。或者一次性完成这一切,不要试图为每个符号拆分它。有很多方法可以避免使用宏语言(通常会被过度使用),而且通常速度更快!