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

Generating multiple SAS programs using `filename` statements

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

是否可以将 file 语句重定向到每个 first.libname 的正确目录?

在文件语句中使用FILEVAR选项。

来自 SAS KB24599:http://support.sas.com/kb/24/599.html

/* Create sample data */

data test;
  input color $ num;
datalines;
blue 1
blue 2
blue 3
green 4
green 5
red 6
red 7
red 8
;

data _null_;
  length fname .;
  set test;     
  by color;                                               
  if first.color then count+1;
  fname="C:\TEMP\file" || trim(left(put(count,8.)))||".txt";
  file dummy filevar=fname;
  put color num count;
run;

为了进一步扩展 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 ;