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