mirror of
https://github.com/sasjs/core.git
synced 2025-12-10 14:04:36 +00:00
74 lines
2.3 KiB
SAS
Executable File
74 lines
2.3 KiB
SAS
Executable File
/**
|
|
@file
|
|
@brief Returns dataset variable list direct from header
|
|
@details WAY faster than dictionary tables or sas views, and can
|
|
also be called in macro logic (is pure macro). Can be used in open code,
|
|
eg as follows:
|
|
|
|
%put List of Variables=%mf_getvarlist(sashelp.class);
|
|
|
|
returns:
|
|
> List of Variables=Name Sex Age Height Weight
|
|
|
|
For a seperated list of column values:
|
|
|
|
%put %mf_getvarlist(sashelp.class,dlm=%str(,),quote=double);
|
|
|
|
returns:
|
|
> "Name","Sex","Age","Height","Weight"
|
|
|
|
@param [in] libds Two part dataset (or view) reference.
|
|
@param [in] dlm= ( ) Provide a delimiter (eg comma or space) to separate the
|
|
variables
|
|
@param [in] quote= (none) use either DOUBLE or SINGLE to quote the results
|
|
@param [in] typefilter= (A) Filter for certain types of column. Valid values:
|
|
@li A Return All columns
|
|
@li C Return Character columns
|
|
@li N Return Numeric columns
|
|
|
|
@version 9.2
|
|
@author Allan Bowe
|
|
|
|
**/
|
|
|
|
%macro mf_getvarlist(libds
|
|
,dlm=%str( )
|
|
,quote=no
|
|
,typefilter=A
|
|
)/*/STORE SOURCE*/;
|
|
/* declare local vars */
|
|
%local outvar dsid nvars x rc dlm q var vtype;
|
|
|
|
/* credit Rowland Hale - byte34 is double quote, 39 is single quote */
|
|
%if %upcase("e)=DOUBLE %then %let q=%qsysfunc(byte(34));
|
|
%else %if %upcase("e)=SINGLE %then %let q=%qsysfunc(byte(39));
|
|
/* open dataset in macro */
|
|
%let dsid=%sysfunc(open(&libds));
|
|
|
|
%if &dsid %then %do;
|
|
%let nvars=%sysfunc(attrn(&dsid,NVARS));
|
|
%if &nvars>0 %then %do;
|
|
/* add variables with supplied delimeter */
|
|
%do x=1 %to &nvars;
|
|
/* get variable type */
|
|
%let vtype=%sysfunc(vartype(&dsid,&x));
|
|
%if &vtype=&typefilter or &typefilter=A %then %do;
|
|
%let var=&q.%sysfunc(varname(&dsid,&x))&q.;
|
|
%if &var=&q&q %then %do;
|
|
%put &sysmacroname: Empty column found in &libds!;
|
|
%let var=&q. &q.;
|
|
%end;
|
|
%if %quote(&outvar)=%quote() %then %let outvar=&var;
|
|
%else %let outvar=&outvar.&dlm.&var.;
|
|
%end;
|
|
%end;
|
|
%end;
|
|
%let rc=%sysfunc(close(&dsid));
|
|
%end;
|
|
%else %do;
|
|
%put &sysmacroname: Unable to open &libds (rc=&dsid);
|
|
%put &sysmacroname: SYSMSG= %sysfunc(sysmsg());
|
|
%let rc=%sysfunc(close(&dsid));
|
|
%end;
|
|
%do;%unquote(&outvar)%end;
|
|
%mend mf_getvarlist; |