SAS Macro to Create a delimited text file from a SAS dataset... A document that discusses SAS Macro to Create a delimited text file from a SAS data set.. options mprint; data one; input id name :$20. amount ; date=today(); format amount dollar10.2 date mmddyy10.; label id="Customer ID Number"; datalines; 1 Grant 57.23 2 Michael 45.68 3 Tammy 53.21 ;
%macro makefile ( dataset=_last_ , /* Dataset to write */ filename=print , /* File to write to */ dlmr="," , /* Delimiter between values */ qtes="no" , /* Should SAS quote all character variables? */ header="no" , /* Do you want a header line w/ column names? */ label="no" /* Should labels be used instead of var names in header? */ ); proc contents data=&dataset out=___out_; run; /* Return to orig order */ proc sort data=___out_; by varnum; run; /* Build list of variable names */ data _null_; set ___out_ nobs=count;
call symput("name"!!left(put(_n_,3.)),name); call symput("type"!!left(put(_n_,3.)),type); /* Use var name when label not present */ if label=" " then label=name; call symput("lbl"!!left(put(_n_,3.)),label); if _n_=1 then call symput("numvars", trim(left(put(count, best.)))); run; /* Create file */ data _null_; set &dataset; file &filename; %global temp; %if &qtes="yes" %then %let temp='"'; %else %let temp=' '; %if &header="yes" %then %do; /* Conditionally add column names */ if _n_=1 then do; put %if &label="yes" %then %do; %do i=1 %to &numvars-1; &temp "%trim(%bquote(&&lbl&i)) " +(-1) &temp &dlmr %end; &temp "%trim(%bquote(&&lbl&numvars)) " &temp; %end; %else %do; %do i=1 %to &numvars-1; &temp "%trim(&&name&i) " +(-1) &temp &dlmr %end; &temp "%trim(&&name&numvars) " &temp ; %end; ; end; %end; /* Build PUT stmt to write values */ put %do i = 1 %to &numvars -1; %if &&type&i ne 1 and &qtes="yes" %then %do; '"' &&name&i +(-1) '"' &dlmr %end;
%else %do; &&name&i +(-1) &dlmr %end; %end; %if &&type&i ne 1 and &qtes="yes" %then %do; /* Write last varname */ '"' &&name&numvars +(-1) '"'; %end; %else %do; /* Write last varname */ &&name&numvars; %end; run; %mend makefile; /* If LRECL= required because of records longer the 256, specify here */ filename myfile "~/tmp/rawdata" lrecl=1000;
/* Invoke macro to write to a file, include proper parameters for your case. */ /* Make sure that the variables are in the order you want and have the */ /* desired formats. */ %makefile(dataset=one, filename=print, /* FILEREF or DDNAME of the file */ dlmr=",", qtes="yes", header="yes", label="yes"); run; You might also like: • SAS Macro to split a dataset into multiple datasets vertically with a common primary key • SAS macro to reorder dataset variables in alphabetical order • SAS Interview Questions and Answers(2) • Ways to Count the Number of Obs in a dataset and pass it into a macro variable...
Read full article @ http://sastechies.blogspot.com/2009/11/sas-macro-to-createdelimited-text-file.html