* mkvarlist2.sas Daniel Brockman 070724 Make list of var names in a data set.; /* --------------------------------------------------------- */ %macro mkvarlist2(inp) ; options nomlogic nomprint nosymbolgen ; * noise reduction we believe it works ; /* * %mkvarlist2 returns, * 1. in global variable greturn, a list of the names of the variables * in input data set &inp . * 2. in global variable greturn1, the number of variables * in input data set &inp . * mkvarlist2 improves on predecessor macro mkvarlist . * Shamelessly plagiarized from SAS help pages description of * VARNAME function. * * Example: * %global greturn ; * %global greturn1; * %mkvarlist2(mylib.mydataset) ; * %let vlist = &greturn ; * * 070804 db. Added greturn2 (numeric list) & greturn3 (number of numerics) * & greturn4 (character list) & greturn5 (number of char vars) . */ %global greturn ; * list of vars ; %global greturn1; * count of vars ; %global greturn2; * list of numeric vars ; %global greturn3; * count of numeric vars ; %global greturn4; * list of character vars ; %global greturn5; * count of character vars ; %let dsid=%sysfunc(open(&inp)); * open the dataset ; %let greturn=; * list of vars ; %let greturn1=%sysfunc(attrn(&dsid,nvars)); * number of vars; %let greturn2=; %let greturn3=0; %let greturn4=; %let greturn5=0; %let i=0 ; %do %while(%eval(&i+1) le &greturn1 ) ; %let i=%eval(&i+1) ; %let vn=%sysfunc(varname(&dsid,&i)) ; %let greturn=&greturn &vn ; %if (%sysfunc(vartype(&dsid,&i)) = N) %then %do ; %let greturn3=%eval(&greturn3+1) ; %let greturn2=&greturn2 &vn ; %end ; %else %do ; %let greturn4=&greturn4 &vn ; %let greturn5=%eval(&greturn5+1); %end ; %end; * do while ; %let rc=%sysfunc(close(&dsid)); * close the dataset ; %put mkvarlist L36 dataset:&inp varlist:&greturn number of vars:&greturn1 numeric varlist:&greturn2 number of numeric vars:&greturn3 char varlist:&greturn4 number of char vars:&greturn5 ; /* restore options */ options mlogic mprint symbolgen ; %mend mkvarlist2;