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