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

时间:2015-09-03 15:04:50

标签: sas code-generation

我有一个大型数据集,用于指定不同libnames中数据集的变量元数据(从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的正确目录?

2 个答案:

答案 0 :(得分:2)

使用文件语句中的*tmp*选项。

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

over()

答案 1 :(得分:1)

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