使用'filename'语句生成多个SAS程序

使用'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

我有一个大型数据集,它为不同libname中的数据集的变量指定元数据(从
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 ;