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

时间:2017-08-03 18:12:53

标签: 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 > 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语句的数据集中。

1 个答案:

答案 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 EXECUTEDOSUBL或以其他方式构建宏调用(PROC SQL SELECT INTO,{{1}等等)。