我使用一个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')
有人能提出解决办法吗?
发布于 2021-06-11 17:15:26
在您的特殊情况下,为什么不只是将实际引号包含在宏参数值中而不是将它们添加到宏中呢?
因此,更改宏定义:
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')发布于 2021-06-11 18:43:22
如果要执行宏引用路由,则必须执行两次%nrstr --因为它已经“解决”了两次,一次是在call execute执行其任务时,另一次是在宏内。
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,这两种方法都允许您在不需要执行相同步骤的情况下完成这些操作。或者一次完成所有的操作,不要试图对每个符号进行分割。有很多方法可以避免宏语言(宏语言往往被过度使用),而且通常也更快!
https://stackoverflow.com/questions/67940543
复制相似问题