Поскольку вы собираетесь генерировать код, нет необходимости использовать такой сложный макрос для поиска файлов.Этот первый макрос слишком сложен, потому что он использует код макроса для вызова функций SAS.Используйте что-то, что просто использует код SAS (вместо макрокода) и генерирует набор данных найденных файлов.
%macro files(dir,ext,dsn=files);
filename mydir "&dir";
data &dsn ;
length name $256 ;
did=dopen('mydir');
if did then do;
do i=1 to dnum(did);
name="&dir\"||dread(did,i);
if upcase(scan(name,-1,'.'))=%upcase("&ext") then output;
end;
rc=dclose(did);
end;
keep name;
run;
filename mydir;
%mend files;
Затем используйте набор данных имен файлов для генерации кода для импорта каждого файла.Либо напрямую сгенерируйте код для импорта каждого файла, либо создайте простой макрос, который импортирует один файл и генерирует вызовы к этому макросу.
Проблема с пробелами в именах файлов, вероятно, влияет на оператор FILENAME во втором фрагменте кода.,Просто добавьте еще кавычки.
%macro readfile(filename,dsn);
filename comgzip pipe "gzip -cd ""&filename"" ";
data &dsn;
infile comgzip dsd truncover;
input
ContractID $
ProdID $
IssueDate $
Market $
TaxClsCode $
BenEffDate $
PriceDate $
AnnuitDOB $
AnnuitAge
BenYear
BenMonth
;
run;
%mend readfile;
Так что теперь вы можете генерировать звонки с чем-то вроде этого:
%files(/opt/sasdata/mnt/FM/folder,Z) ;
data _null_;
set files;
n+1;
call execute(cats('%readfile(',name,',',cats('dsn',n),')'));
run;