首页 > 解决方案 > 使用数据集变量的文件名语句的正确语法

问题描述

我是 SAS 新手,我似乎无法为此计算出正确的语法。我有一个数据集(fileList),其中一个字段(projFile)包含一个文件名。我希望打开文件并将内容读入将要创建的第二个字段。该文件被压缩(它是一个 SAS-EG 项目文件),所以我被告知我应该使用带有zip选项的Filename语句来读取文件。但是,无论我如何引用projFile,它都不喜欢它。

data fileList;
set fileList;
    filename inzip zip "&projFile" member="project.xml";
    infile inzip;
    input fileContent $char2000.;
    output;
run;

我也可能输入语句错误,但在我能解决这个问题之前,我不知道。谢谢。

标签: sasfilenames

解决方案


如果您总是从 ZIP 文件中读取相同的文件(成员),您可以使用 infile 语句中的 FILEVAR= 选项来切换您正在从哪个 ZIP 文件中读取该成员。

因此,如果我有三个 ZIP 文件,每个文件中都有一个名为 example.txt 的文件,以及一个带有文件名列表的数据集。

data fnames ;
  input filename $80.;
cards;
c:\downloads\file1.zip
c:\downloads\file2.zip
c:\downloads\file3.zip
;

然后我可以使用该数据集来创建一个包含这些文件信息的新数据集。

data test;
  set fnames ;
  fname=filename;
  infile in zip filevar=fname member='example.txt' end=eof truncover;
  do while (not eof);
    input line $100. ;
    output;
  end;
run;

如果驱动数据集有要读取的 ZIP 文件中的成员列表,那么您也可以在 INFILE 语句中使用 MEMVAR= 选项。

data members ;
  infile cards dsd dlm='|' truncover ;
  input filename :$80. memname :$80.;
cards;
c:\downloads\file1.zip|example.txt
c:\downloads\file2.zip|example.txt
c:\downloads\file3.zip|example.txt
;

data test;
  set members ;
  filevar=filename;
  memvar=memname;
  infile in zip filevar=filevar memvar=memvar end=eof truncover;
  do while (not eof);
    input line $100. ;
    output;
  end;
run;

推荐阅读