DATA Step, Macro, Functions and more

no:of obs & vars

Accepted Solution Solved
Reply
Contributor
Posts: 26
Accepted Solution

no:of obs & vars

%macro lib(lib=);
proc sql noprint;
select memname,nvar,nobs
into :     m1, :     v1, :     o1
from dictionary.tables
  where libname="%upcase(&lib)" and memtype='DATA';
quit;
%put _user_;
%mend lib;

%lib(lib=work)


This macro will give the no;of obs and noSmiley Surprisedf vars of the 1st dataset in a library...
But I need to write a macro which gives the noSmiley Surprisedf obs and noSmiley Surprisedf vars of all the datasets in a library...Please help


Accepted Solutions
Solution
‎06-26-2013 01:21 PM
Super User
Super User
Posts: 7,050

Re: no:of obs & vars

Posted in reply to supersonic

How to you want the information formatted?

You could put them into those same three macro variables as delimited values.

select memname

     , nvar

     , nobs

  into :m1 separated by ' '

     , :v1 separated by ' '

     , Smiley Surprised1 separated by ' '


Or you could generated multiple variables.


select memname

     , nvar

     , nobs

  into :m1 - :m999999

     , :v1 - :v999999

     , Smiley Surprised1 - : o999999

...

%let n=&sqlobs;



There is one difficulty with doing this as a macro since by default to new macro variables will be local to the macro and hence not available when the macro ends.  You could force them into the GLOBAL symbol table.  In which case it might be easier to do using CALL SYMPUTX.


data _null_;

   if eof then call symputx('n',_N_-1,'G');

   set sashelp.vtable end=eof;

   where libname = %upcase("&lib") ;

   call symputx(cats('m',_n_),memname ,'G') ;

  call symputx(cats('v',_n_),nvar ,'G') ;

  call symputx(cats('o',_n_),nobs ,'G') ;

run;

View solution in original post


All Replies
Solution
‎06-26-2013 01:21 PM
Super User
Super User
Posts: 7,050

Re: no:of obs & vars

Posted in reply to supersonic

How to you want the information formatted?

You could put them into those same three macro variables as delimited values.

select memname

     , nvar

     , nobs

  into :m1 separated by ' '

     , :v1 separated by ' '

     , Smiley Surprised1 separated by ' '


Or you could generated multiple variables.


select memname

     , nvar

     , nobs

  into :m1 - :m999999

     , :v1 - :v999999

     , Smiley Surprised1 - : o999999

...

%let n=&sqlobs;



There is one difficulty with doing this as a macro since by default to new macro variables will be local to the macro and hence not available when the macro ends.  You could force them into the GLOBAL symbol table.  In which case it might be easier to do using CALL SYMPUTX.


data _null_;

   if eof then call symputx('n',_N_-1,'G');

   set sashelp.vtable end=eof;

   where libname = %upcase("&lib") ;

   call symputx(cats('m',_n_),memname ,'G') ;

  call symputx(cats('v',_n_),nvar ,'G') ;

  call symputx(cats('o',_n_),nobs ,'G') ;

run;

🔒 This topic is solved and locked.

Need further help from the community? Please ask a new question.

Discussion stats
  • 1 reply
  • 150 views
  • 0 likes
  • 2 in conversation