Skip to content

Instantly share code, notes, and snippets.

@shivallan
Last active August 29, 2015 14:20
Show Gist options
  • Select an option

  • Save shivallan/b526ca523d4f14eed4b3 to your computer and use it in GitHub Desktop.

Select an option

Save shivallan/b526ca523d4f14eed4b3 to your computer and use it in GitHub Desktop.
* Setting options for macro;
options MCOMPILENOTE = ALL MLOGIC MPRINT MPRINTNEST MLOGICNEST;
* Code for Output CLS;
ods html close; /* close previous */
ods html; /* open new */
%macro mCreateData (mvTable, mvFile);
%put &mvFile;
%local mvOpen;
%local mvClose;
* Opening and connection to Table;
%let mvOpen = %sysfunc(open(&mvTable));
%put mvOpen = &mvOpen;
%syscall set(mvOpen);
* Number of variables and observations;
%let nobs = %sysfunc(attrn(&mvOpen, nobs));
%let nvars = %sysfunc(attrn(&mvOpen, nvars));
%put &nobs;
%put &nvars;
* Names, labels, etc.....;
%let OLabel = %sysfunc(attrc(&mvOpen, LABEL));
%let OLibRef = %sysfunc(attrc(&mvOpen, LIB));
%let OName = %sysfunc(attrc(&mvOpen, MEM));
%put &OLabel;
%put &OLibRef;
%put &OName;
* Start code generation;
data _null_;
file &mvFile;
* Creating DATA STEP;
put "data &OLibRef..&OName;"
/" attrib";
*Creating ATTRIB lines;
%let i = 1;
%do %while (&i <= &nvars);
%let vname = %sysfunc(varname(&mvOpen, &i));
put " &vname length = "@;
%let vtype = %sysfunc(vartype(&mvOpen, &i));
if ("&vtype" = "C") then put "$"@;
%let vlen = %sysfunc(varlen(&mvOpen, &i));
put "&vlen"@;
%let vfmt = %sysfunc(varfmt(&mvOpen, &i));
if ("&vfmt" ^= "") then put " format = &vfmt "@;
%let vinfmt = %sysfunc(varinfmt(&mvOpen, &i));
if ("&vinfmt" ^= "") then put " informat = &vinfmt "@;
%let vlabel = %sysfunc(varlabel(&mvOpen, &i));
put " label = '&vlabel'";
%let i = %eval(&i + 1);
%end;
put " ;";
put " infile datalines delimiter = ',';";
%let i = 1;
* Creating INPUT line;
put " input "@;
%do %while (&i <= &nvars);
%let vname = %sysfunc(varname(&mvOpen, &i));
put "&vname "@;
%let vtype = %sysfunc(vartype(&mvOpen, &i));
if ("&vtype" = "C") then put "$ "@;
%let i = %eval(&i + 1);
%end;
* Creating DATALINES;
put ";"/" datalines;"/" "@;
%let i = 1;
%do %while (&i <= &nobs);
%let mvCurValue = %sysfunc(fetchobs(&mvOpen, &i));
%let j = 1;
%do %while (&j <= &nvars);
%let vname = %sysfunc(varname(&mvOpen, &j));
put "&&&vname,"@;
%let j = %eval(&j + 1);
%end;
put /" "@;
%let i = %eval(&i + 1);
%end;
put ";";
put "run;";
run;
proc contents data = &OLibRef..&OName out2 = indexes_table noprint;
run;
%let mvOpen1 = %sysfunc(open(indexes_table));
%put mvOpen1 = &mvOpen1;
%syscall set(mvOpen1);
%let nobs = %sysfunc(attrn(&mvOpen1, nobs));
* Creation of indexes;
data _null_;
file &mvFile mod;
put "proc datasets library = &OLibRef nolist;"
/" modify &OName;";
%let i = 1;
%do %while (&i <= &nobs);
%let mvCurValue = %sysfunc(fetchobs(&mvOpen1, &i));
%let vname = Recreate;
put " &&&vname";
%let i = %eval(&i + 1);
%end;
put "quit;";
run;
* Close the Table;
%let mvClose = %sysfunc(close(&mvOpen));
%let mvClose1 = %sysfunc(close(&mvOpen1));
%put mvClose = &mvClose;
%put mvClose1 = &mvClose1;
%mend mCreateData;
%mCreateData(tasks.table_1, "C:\Users\Andrey.Belov\Documents\My SAS Files\My_tasks\6\Test1.sas");
%mCreateData(sashelp.air, "C:\Users\Andrey.Belov\Documents\My SAS Files\My_tasks\6\Test2.sas");
%mCreateData(sasuser.sale2000, "C:\Users\Andrey.Belov\Documents\My SAS Files\My_tasks\6\Test3.sas");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment