使用'filename'语句生成多个SAS程序
我有一个大型数据集,它为不同libname中的数据集的变量指定元数据(从使用'filename'语句生成多个SAS程序,sas,code-generation,Sas,Code Generation,我有一个大型数据集,它为不同libname中的数据集的变量指定元数据(从sashelp.vcolumn中提取) 运行本程序时,我得到了如下代码,其中输出了一个大型程序-这工作正常。但是,我发现我需要转移文件名,以便为遇到的每个新libname在适当的目录中生成一个程序: data _null_ ; set metadata end=eof ; by libname memname ; file sascode ; if first.libname then put "proc
sashelp.vcolumn
中提取)
运行本程序时,我得到了如下代码,其中输出了一个大型程序-这工作正常。但是,我发现我需要转移文件名,以便为遇到的每个新libname在适当的目录中生成一个程序:
data _null_ ;
set metadata end=eof ;
by libname memname ;
file sascode ;
if first.libname then put "proc datasets lib=" libname " nolist ;";
if first.memname then put " modify "memname ";";
if last.libname then put " run;
if eof then put "quit ;";
run ;
是否可以先将
文件语句重定向到每个的正确目录。libname
?使用文件语句中的FILEVAR
选项
从SAS KB24599:
为了进一步扩展Reeza的回答,下面是如何使用dictionary.libnames
中的元数据。我在这里使用dictionary.tables
,但是如果需要使用.columns
来获取(无论您对列执行什么操作),这也应该同样有效
libname temp 'c:\temp';
data class temp.class;
set sashelp.class;
run;
proc sql;
create table metadata as
select T.libname, T.memname, L.path
from dictionary.tables T, dictionary.libnames L
where T.libname=L.libname
and T.memname='CLASS'
and level=0 /* this eliminates SASHELP lib which is a bit crazy */
;
quit;
data _null_ ;
set metadata end=eof;
by libname path memname ;
fn = cats(path,'\sasfile.sas');
file sascode filevar=fn;
if first.libname then put "proc datasets lib=" libname " nolist ;";
if first.memname then put " modify " memname ";";
if last.libname then put " run; quit;";
run ;
当你说转移文件名
时,你的意思是每次libname更改时都创建一个新文件吗?嗨,乔-谢谢,是的,我正试图以一个唯一的程序写入每个libname目录。你看过file语句中的filevar选项了吗?谢谢乔-也从字典表中提取路径-完美:-)@Reeza也谢谢你-我也投了赞成票。乔,只是出于兴趣-你为什么说“…SASHELP lib有点疯狂”?SASHELP是一个组合库,由11个目录(大约)组成。因此,您将为此生成大量文件。
libname temp 'c:\temp';
data class temp.class;
set sashelp.class;
run;
proc sql;
create table metadata as
select T.libname, T.memname, L.path
from dictionary.tables T, dictionary.libnames L
where T.libname=L.libname
and T.memname='CLASS'
and level=0 /* this eliminates SASHELP lib which is a bit crazy */
;
quit;
data _null_ ;
set metadata end=eof;
by libname path memname ;
fn = cats(path,'\sasfile.sas');
file sascode filevar=fn;
if first.libname then put "proc datasets lib=" libname " nolist ;";
if first.memname then put " modify " memname ";";
if last.libname then put " run; quit;";
run ;