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

时间:2018-04-14 11:25:07

标签: sas

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

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 :(得分:0)

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

Windows中的

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

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

答案 1 :(得分:0)

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

在数据步骤中使用_infile_语句时,INPUT自动变量可用。它将保存从输入文件中读取的最后一行。在这种情况下,输入文件是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;