Return to Snippet

Revision: 22954
at January 26, 2010 14:27 by sastechies


Initial Code
/*Lets take an example*/

options source 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
;
run;

%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;

/*Remove the temporary contents dataset created above*/
proc datasets lib=work nolist;
 delete ___out_;
quit;

/* 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 mycsv "C:\csvdata.txt" lrecl=1000;
filename mypipe "C:\pipedata.txt" lrecl=1000;
filename mypipe2 "C:\pipedata2.txt" 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=mycsv,     /* FILEREF or DDNAME of the file */ 
          dlmr=",",
          qtes="yes",
          header="yes",
          label="yes");

%makefile(dataset=one,
          filename=mypipe,     /* FILEREF or DDNAME of the file */ 
          dlmr="|",
          qtes="yes",
          header="yes",
          label="yes");

%makefile(dataset=one,
          filename=mypipe2,     /* FILEREF or DDNAME of the file */ 
          dlmr="|",
          qtes="no",
          header="yes",
          label="yes");

Initial URL
http://sastechies.blogspot.com/2009/11/sas-macro-to-create-delimited-text-file.html

Initial Description

                                

Initial Title
SAS Macro to create a delimited text /csv file from a SAS data set..

Initial Tags
file, text

Initial Language
SAS