You are on page 1of 4

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-create-
delimited-text-file.html

You might also like