首页 文章

在FILENAME语句中使用PIPE和操作系统命令

提问于
浏览
-4

如果我在位置c:/ data下面有文件夹和sas文件,那么下面的代码做什么以及sas数据集的可能输出是什么?

new.sas7bat

news.sas7bat

filename files pipe "find c:/data -name '*.sas7bat";
data new;
  infile files lrecl=120 pad missover;
  input;
  if index(lowcase(_infile_), 'datas') then delete;
  type = 'F';
run;

_infile如何在此代码中处理 .

2 回答

  • 0

    INFILE 语句读取文件, _infile_ 部分是PIPE命令的输出 . 在这种情况下, INFILE 只是简单地获取从OS传递的信息,在这种情况下可能是Windows,因为 C:\ 部分 .

    在Windows中 FIND ,搜索文件夹中包含sas7bdat的文件,因此该程序可能会在数据文件夹中搜索SAS7BDAT文件列表 .

    此问题中没有任何内容表明涉及UNIX . FIND是WINDOWS和/或UNIX命令 .

  • 0

    在Unix中, find 命令是一个非常强大的搜索文件系统(目录树)的工具 . 使用 -name 谓词的示例将返回与您的模式匹配的文件名 . 因为您没有以任何其他方式限制它,它将从给定的路径开始搜索整个子树 .

    在数据步骤中使用 INPUT 语句时, _infile_ 自动变量可用 . 它将保存从输入文件中读取的最后一行 . 在这种情况下,输入文件是Unix find命令结果的流式传输 .

    您的SAS计划并不完整 . 基本上,您创建的数据集只有一个名为 type 的变量,其值始终为 "F" . 唯一的信息是,观察数量将与找到的名称(包括目录路径)不包含字符串 "datas" 的SAS数据集的数量相匹配 .

    因此,如果要在路径 /data 下找到所有SAS数据集的名称,其中名称(和路径)在任何情况下都不包含字符串 datas ,那么很可能您需要这样的内容:

    data new;
      infile "find /data -name '*.sas7bat'" pipe truncover ;
      input fname $256. ;
      if index(lowcase(fname), 'datas') then delete;
      type='F';
    run;
    

相关问题