Revision: 22953
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at January 26, 2010 14:26 by sastechies
Initial Code
/* Taking an example... */ data flags; set sashelp.flags; run; /** To be called like this... %splitdsnverticallykey(dsn,varperdsn,keyvars=); eg. %splitdsnverticallykey(sashelp.vtable,4,keyvars=memname libname); Where ----------- dsn - libname.datasetname to be split varperdsn - How many vars per dsn excluding the key variables keyvars - specify the primary key variables */ %macro splitdsnverticallykey(dsn,varperdsn,keyvars=); /* split the keyvars into individual macro var names*/ %let num=1; %let keyvar=%scan(&keyvars,&num,' '); %let keyvar&num=&keyvar; %let keyvarstr=%str(%")&keyvar%str(%",); %do %while(&keyvar ne ); %let num=%eval(&num + 1); %let keyvar=%scan(&keyvars,&num,' '); %let keyvar&num=&keyvar; %if &keyvar ne %then %let keyvarstr=&keyvarstr%str(%")&keyvar%str(%",); %end; %let numkeyvars=%eval(&num - 1); %let keyvarstr=%substr(&keyvarstr,1,%length(&keyvarstr)-1); data _null_; /*Open the dataset and assign to handler*/ dsid=open("&dsn","i"); /*attrn with nvars gives u the count of variables */ numofvars=attrn(dsid,"nvars"); call symput('numofvars',numofvars-&numkeyvars); /*identify total number of dsns would it fit excluding the key vars*/ totalnumdsns=ceil((numofvars-&numkeyvars)/&varperdsn); call symput('totalnumdsns',totalnumdsns); do i=1 to numofvars; varname=trim(left(varname(dsid,i))); if varname not in (&keyvarstr) then do; k+1; /*Get the name of the variables into macro variables*/ call symput(compress('varname'||k),varname); end; end; rc=close(dsid); run; %let totalnumdsns=&totalnumdsns; %let numofvars=&numofvars; %put The dataset &dsn with &numofvars of variables excluding variables {&keyvars} is split vertically into &totalnumdsns datasets; /* name the datasets in sequence */ %let start=0; %let end=0; %do i=1 %to &totalnumdsns; %let start=%eval((&i-1)*&varperdsn + 1); %let end=%eval(&start + &varperdsn - 1); %if &end ge &numofvars %then %let end=&numofvars; %put start=&start end=&end; data &dsn.&i; /*Note: There should be a blank after &dsn.&totalnumdsns*/ retain &keyvars; set &dsn (keep=&keyvars %do m=&start %to &end; &&varname&m. %end;); run; %end; %mend splitdsnverticallykey; options nosource; %splitdsnverticallykey(flags,4,keyvars=title);
Initial URL
http://sastechies.blogspot.com/2010/01/sas-macro-to-split-dataset-into.html
Initial Description
Initial Title
SAS Macro to split a dataset into multiple datasets vertically with a common primary key
Initial Tags
Initial Language
SAS