Download loaddata.sas loaddata.sasSubmit a comment

/* Richard A. DeVenezia
 * January 29, 2004
 *
 * Very simple cards like emulation for DATA Steps emitted by macro
 */
%macro loaddata (

  input=        %* input statement (without the input);
, data=         %* data to read values from;
, debug=        %* any single DATA Step statement - typically a put;
, limit=1000    %* maximum number of rows to output - also prevents infinite loops;
, lrecl=5000    %* size of _infile_ buffer - should be large enough to contain data;
, bufferef=     %* the fileref used to obtain _infile_ buffer;

);

  %*
  %* Works on the presumption that input mates well with data
  %* After inputting last block of values the _infile_ column pointer
  %* will be at artifical end-of-data marker FF
  %*;

  infile &bufferef lrecl=&lrecl col=_column_;

  input @;

  _infile_ = "&data." || "20FF"X;
  _infile_len_ = length (_infile_); drop _infile_len_;

  _n_ = 0;
  do while (_error_ = 0);
    _n_ + 1;

    input &input @;

    &debug;

    output;

    if _column_ = _infile_len_ then leave;

    if _n_ > &limit then stop; * prevent infinte loops;
  end;

%mend;

Sample code

%macro foo;
  filename null pipe "echo";
  data a;
  %loaddata(
    bufferef = null
  , input= x y1 y2 y3
  , debug= put x y1 y2 y3
  , data=
  1 1 2 3
  2 3 4 5
  3 4 5 6
  4 5 6 7
  5 6 7 8
  6 7 8 9
  7 8 9 10
  )
  run;
  filename null ;
%mend;

options mprint;

%foo