Sas 错误:文件名FNAME没有逻辑分配

Sas 错误:文件名FNAME没有逻辑分配,sas,Sas,我正在运行以下代码: %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

我正在运行以下代码:

%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;
但是,我得到了一个错误:错误:没有为文件名FNAME分配逻辑

我想知道这是什么原因造成的


文件夹组中有许多csv文件。我试图在每个文件上运行NBBO宏,并使用infle语句将每个文件加载到数据集中

您正在以一种不允许的方式混合数据步骤代码和宏代码。您不能提取变量fname的内容,并使用它以这种方式填充宏变量。相反,您将文本fname传递给该宏变量,而该宏变量则不起作用

您也不能以这种方式在数据步骤内运行另一个数据步骤。您需要在数据步骤终止后或执行期间使用各种方法之一来执行它

最后,我完全不清楚你到底在做什么:因为你最终只会得到数据集中的其中一个文件

我想你可能想要这样的东西,这样容易得多。我在infle中使用FILEVAR选项,它使用变量的值;我必须对计算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、%INCLUDE等

我是否可以对文件名中的每个文件调用宏NBBO?例如,调用executecats“%nRST%NBBO”,fname,;是的,这可能就是您使用callexecute的方式,或多或少。在上面的例子中,它不会做你想做的,但是,我的例子是你想做的,我很确定,除非你的例子不具有代表性。是的,我想在NBBO中执行更多的代码。我想每次输入一个不同的csv文件。然后你有各种各样的选择,调用execute就是其中之一。