【问题标题】:SAS Macro not detecting a fileSAS 宏未检测到文件
【发布时间】:2015-10-11 23:53:39
【问题描述】:

CMS 发布了一个 SAS 宏来检查文件是否存在:

** check existance of dataset**;
%macro CHECKDS(FILE,LONGFILE);
  %if %sysfunc(exist(&FILE)) %then;
  %else %do;
  data _null_;
  file print ls=255;
  &MSG30 put "ERROR  : [Msg30] Program halted, file &LONGFILE does not exist";
  abort; run;
%end;
%mend CHECKDS;

现在当我用这个来称呼它时:

LIBNAME  IN1     "/folders/myfolders/";
%CHECKDS(&STPERSON.TXT,PERSON)
run;

我收到此错误:错误:[Msg30] 程序已停止,文件 PERSON 不存在。

我知道文件存在并且在那个位置。有什么想法吗?

【问题讨论】:

  • 您的宏分辨率似乎有问题。将&STPERSON.TXT 更改为&STPERSON..TXT,这将允许您的宏变量解析,但在它和扩展名(TXT)之间留一个句点字符。
  • 我实际上是从真正的设置中简化了这个。调用 CHECKDS() 的宏正在向它传递一个变量“INP”,该变量在不同的宏中分配。所以它实际上是:%CHECKDS(&INP, PERSON)。但我试图用实际文件显式调用 if 进行测试。两者都不起作用。您的上述建议无效,但谢谢,
  • 出于测试目的,在%macro 语句下方添加%put &FILE;。这将使您能够准确地看到 exist 函数正在寻找什么。
  • SAS UE 区分大小写,文件是 PERSON 还是 person?并且很可能是 .txt 而不是 TXT
  • 刚刚意识到EXIST 是检查数据集的函数。你试过FILEEXIST吗?

标签: macros sas


【解决方案1】:

exist 函数的第一个参数应采用libname.memname 格式。 exist 函数的第二个参数指定成员类型;由于您没有指定成员类型,因此假定为默认值 DATA。这意味着文件的 SAS 数据文件具有 sas7bdat 扩展名。

有关成员类型的列表,请参阅 here

由于您的文件是 .txt 文件,我认为它不能被视为库成员。如果我错了,欢迎任何人纠正我。

【讨论】:

    【解决方案2】:

    DWal 就在上面。这是我必须做的更完整的答案。我必须将 .txt 文件转换为 sas 数据集(尤其是 .sas7bdat)。

    proc import datafile="/folders/myfolders/PERSON"
        dbms=dlm
        out=person
        replace;
        delimiter=' ';
        getnames=yes;
    run;
    

    然后必须将其写入我的库中,我才能使用它。

    data IN1.person ;
    set person;
    run;
    

    【讨论】:

      猜你喜欢
      • 2014-09-15
      • 1970-01-01
      • 2021-07-09
      • 2021-11-24
      • 2016-05-25
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 2014-02-21
      相关资源
      最近更新 更多