Ошибка макроса SAS найдено больше позиционных параметров, чем определено - PullRequest
0 голосов
/ 26 января 2019

Я создал макрос с использованием SAS версии 9.4 для чтения данных из набора данных zta DTAQ. код выглядит следующим образом (он читает данные из торгового файла 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 голосов
/ 26 января 2019

Чтобы избежать сообщения об ошибке 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;
...