Sas 使用dataset变量更正Filename语句的语法

Sas 使用dataset变量更正Filename语句的语法,sas,filenames,Sas,Filenames,我是一个SAS新手,我似乎无法为这个问题找到正确的语法。我有一个数据集(文件列表),其中一个字段(projFile)包含一个文件名。我希望打开文件并将内容读入将创建的第二个字段。文件是压缩的(它是SAS-EG项目文件),因此我被告知应该使用Filename语句和zip选项来读取文件。然而,无论我如何引用projFile它都不喜欢它 data fileList; set fileList; filename inzip zip "&projFile" membe

我是一个SAS新手,我似乎无法为这个问题找到正确的语法。我有一个数据集(文件列表),其中一个字段(projFile)包含一个文件名。我希望打开文件并将内容读入将创建的第二个字段。文件是压缩的(它是SAS-EG项目文件),因此我被告知应该使用Filename语句和zip选项来读取文件。然而,无论我如何引用projFile它都不喜欢它

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

我可能也有输入语句错误,但直到我能通过这个问题,我不知道。谢谢。

这里有一些问题

首先-您可能不应该使用
数据文件列表;设置文件列表如果你正在做这样的事情。创建一个新的数据集

第二个-
文件名
不可执行。它是声明性的。您可以将它放在数据步骤中,但不应该,正是因为这个原因:它让您认为它在数据步骤中做了一些事情。不是。它正在做一些事情,周期,然后数据步骤发生,稍后(即使放在这里)

第三,您没有正确地使用
infle
,但这实际上是第二种情况的后果。您需要
infle
上的
filevar
选项,以允许它在此处执行不同的操作

第四,您可能不想只是随意地阅读
project.xml
。真的这整件事可能不是你想做的。。。我已经做了你正在做的,这是可行的,但不是这样。但这可能是一个更大的问题

如果这能起作用,你要做的是:

filename a zip "c:\doesntmatter.egp" member="project.xml";

data files;
  length fname $255;
  infile datalines truncover;
  input @1 fname $255.;
datalines;
c:\myfile.egp
c:\myfile2.egp
c:\myfile3.egp
;;;;
run;

data egp;
  set files;
  infile a filevar=fname pad truncover;
  input @1 first_line $512. @;
  put first_line;
run;
filename
语句实际上没有任何作用,但我将向您展示它的用途。您可以在infle语句中看到
filevar
,它指向
files
上的
fname
变量。然后从那里读进去

我的一般建议是,您可能应该在这里使用
xml
libname引擎;在每个xml的基础上,找出要执行的操作,将其作为宏写出,然后为文件名数据集中的每一行调用宏(可能使用
call execute
,或者如果必须使用
dosubl
)。您不必使用
xml
libname引擎,但它很可能会简化事情

如果您只使用一个文件,那么您可以直接在我上面显示的
filename
语句中指定它,只需对该文件名使用
infle
infle a;
,但请将其称为比
a
更合理的名称)。但同样,以这种方式阅读它是愚蠢的——使用libname引擎,因为它将为您解析xml



编辑,以删除经Tom答案确认的错误信息。即使它确实可以工作,我也不建议在这里使用
infle
——使用libname引擎阅读它,这将节省大量的时间。

如果您总是从ZIP文件中读取同一个文件(成员),您可以使用infle语句中的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文件中有要读取的成员列表,那么您也可以在infle语句中使用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;

您是否还需要通过
LIBNAME
xml引擎以数据方式读取xml文件?谢谢。非常感谢。嗯,我不知道
filevar
可以处理zip文件-很高兴知道它可以@乔几乎用所有的发动机工作。PIPE、FTP、SFTP等等。它对“聚合”文件名不起作用——比如ZIP——我认为FTP是类似的,但很高兴知道它不是!这个答案演示了如何在ZIP引擎上工作。可以将MEMVAR=与FILEVAR=一起使用,也可以不与FILEVAR=一起使用。您甚至可以将MEMVAR=与多目录聚合fileref一起使用<代码>文件名agg(“&dir\test1”“&dir\test2”)。。。infle agg memvar=memname end=eof注意,如果同一个成员出现在多个位置,则使用哪个版本的正常规则。嗯,我必须回去看看是什么原因导致我出现错误-该措辞直接来自SAS回答另一个问题的错误消息。