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