SAS宏错误发现的位置参数多于定义的位置参数

时间:2019-01-26 14:44:45

标签: sas sas-macro

我使用SAS版本9.4创建了一个宏,以从DTAQ zip数据集中读取数据。代码如下所示(它一天一次从DTAQ交易文件中读取数据):

libname rasheek "D:\Rasheek I\";

*** Loop for processing DTAQ_2.1 data;
%macro ZipRead_vars(rawzip,rawfile,outdata,outdata1, ddt,round,macrofile);
%do rd=1 %to &round;
%global zipfile mb outdt outdt1 datadate;
%let zipfile=%scan(&rawzip,&rd,'*');
%let mb=%scan(&rawfile,&rd,'*');
%let datadate=%scan(&ddt,&rd,'*');
%let outdt=%scan(&outdata,&rd,'*');
%let outdt1=%scan(&outdata1,&rd,'*');
%scan(&macrofile,1,'#');
%end;
%mend ZipRead_vars;



%ZipRead_vars(D:\DTAQ_RAW\2014\201401\Trd\EQY_US_ALL_TRADE_20140102.zip*
D:\DTAQ_RAW\2014\201401\Trd\EQY_US_ALL_TRADE_20140103.zip*,
taqtrade20140102*taqtrade20140103*,
rasheek.trd_20140102*rasheek.trd_20140103*,
rasheek.trd_20140102_1*rasheek.trd_20140103_1*, 
20140102*20140103*,2,%TRD_Read21;#);

%macro TRD_Read21;
filename trd zip "&zipfile" member="&mb";
Data &outdt;
Infile trd firstobs=2 missover;
input
@1 hh 2.
@3 mm 2.
@5 ss 2.
@7 ss1 3.
@1 time 9.
@10 Exchange $1.
@11 Symbol $16.
@27 SaleCondition $4.
@31 TradeVolume 9.
@40 TradePrice 11.4

    date=&datadate;
    ticker=compress(symbol);
    stime=hh*3600+mm*60+ss+0.001*ss1;
    DollarVolume=TradeVolume*TradePrice;
    if stime<34200 or stime>57600 then delete;
    run;

proc sql;
create table &outdt1 as 
select date, symbol,SaleCondition, sum(tradevolume)as totaltradevolume, sum(dollarvolume)as totaldollarvolume
from &outdt
group by date, symbol, SaleCondition
;
quit;
%mend TRD_Read21;

运行代码时出现错误:找到的位置参数多于定义的位置参数。但是,如果我将代码的最后部分更改为以下内容,则它可以工作。

create table &outdt1 as 
select * from &outdt
;
quit;
%mend TRD_Read21;

请帮助/指导我修复代码。先感谢您

1 个答案:

答案 0 :(得分:2)

为避免出现more positional parameters错误消息,您可以做的一件事就是始终使用参数名称来调用宏。这样,您就知道哪个参数正在调用中获取哪个值。 SAS允许您在调用中使用参数名称,即使是已定义的参数也可以按位置调用。

让我们为您的宏调用做一下:

%ZipRead_vars
(rawzip=D:\DTAQ_RAW\2014\201401\Trd\EQY_US_ALL_TRADE_20140102.zip
*D:\DTAQ_RAW\2014\201401\Trd\EQY_US_ALL_TRADE_20140103.zip*
,rawfile=taqtrade20140102*taqtrade20140103*
,outdata=rasheek.trd_20140102*rasheek.trd_20140103*
,outdata1=rasheek.trd_20140102_1*rasheek.trd_20140103_1*
,ddt=20140102*20140103*
,round=2
,macrofile=%TRD_Read21;#
);

最后一个参数MACROFILE的值看起来很奇怪。您想将由宏%TRD_READ21生成的文本作为字符串传递给宏%ZipRead_vars吗?该宏仅生成文本吗?如果生成代码,则生成的代码将作为MACROFILE参数的值传递,而不是由SAS执行。

如果要传递宏的名称以进行调用,则不要在调用中包含%

...,macroname=TRD_READ21,....

然后在宏定义中,您可以使用名称来调用宏。

%let macroname=%scan(&macroname,1,#);
%&macroname;
相关问题