我正在运行以下代码:
%LET TIME_INTERVAL='MINUTE15';
/*
* Get the file names of a specific location
*/
%MACRO get_filenames(location,filenames);
filename _dir_ "%bquote(&location.)";
data &filenames(keep=fname);
handle=dopen( '_dir_' );
if handle > 0 then do;
count=dnum(handle);
do i=1 to count;
fname=dread(handle,i);
output &filenames;
end;
end;
rc=dclose(handle);
run;
filename _dir_ clear;
%MEND;
%MACRO NBBO (fname);
DATA TICKERS_NBBO;
INFILE &fname;
INPUT SYMBOL $;
RUN;
%mend;
%MACRO CALCU(DATE_VAR);
%get_filenames('./groups',filenames);
data _null_;
set filenames;
by fname;
if fname =: "&TIME_INTERVAL";
%NBBO(fname);
run;
%mend;
但是,我收到了错误:ERROR: No logical assign for filename FNAME.
我想知道造成这种情况的原因是什么?
文件夹groups
中有很多csv文件。我试图在每个文件上运行NBBO宏,并将每个文件加载到带有infile
语句的数据集中。
答案 0 :(得分:1)
您正在以不允许的方式混合数据步骤代码和宏代码。您无法提取变量fname
的内容并使用它以这种方式填充宏变量。相反,您将文本fname
传递给该宏变量,然后该变量不起作用。
您也无法以这种方式在数据步骤中运行其他数据步骤。在数据步骤终止或执行期间,您需要使用各种方法之一来执行它。
最后,我完全不清楚你在这里做了什么:因为你最终只会在数据集中找到其中一个文件。
我想你可能想要这样的东西,这更容易。我使用FILEVAR
中的infile
选项,该选项使用变量的值;我必须对你如何计算fname进行一些更改(我认为你必须这样做,它没有目录名)。
%MACRO get_filenames(location,filenames);
filename _dir_ "%bquote(&location.)";
data &filenames(keep=fname);
length fname $512;
handle=dopen( '_dir_' );
if handle > 0 then do;
count=dnum(handle);
do i=1 to count;
fname=catx('\',"%bquote(&location.)",dread(handle,i));
output &filenames;
end;
end;
rc=dclose(handle);
run;
filename _dir_ clear;
%MEND;
%get_filenames(location=c:\temp\cars, filenames=fnam);
data tickers_nbbo;
set fnam;
infile a filevar=fname dlm=',';
input symbol $;
run;
如果您确实需要单独调用数据步骤,则需要使用CALL EXECUTE
,DOSUBL
或以其他方式构建宏调用(PROC SQL SELECT INTO
,{{1}等等)。