Send As SMS

Saturday, March 17, 2007

Writing to an in-memory array with PUT

This code writes to an in-memory array using the PUT statement. Although there ought to be a builtin way to do this (there was in the data step language's model, PL/I), there's not. This provides a workaround.

The general idea is create a memory buffer using FILE and INFILE with SHAREBUFFERS; when the file is written to, the value of the automatic variable _INFILE_ is set. You can then copy _INFILE_ to a member of your array. Only one actual I/O operation takes place, because everything is buffered.

The same technique works for a single variable; this example uses an array because that's what I needed when I created the original code.

filename buffer catalog 'work.io.buffer.source' lrecl=100 recfm=f;

data _null_;
   file buffer lrecl=100 recfm=f;
   put ' ';
run;

options stimer fullstimer;

data _null_;

   array claims (1000) $100. _temporary_ (1000 * ' ');

   infile buffer sharebuffers lrecl=100 recfm=f;
   file buffer;

   input @@;  /* Make sure buffer exists */

   do i = 1 to 1000;
      put @1 'a b c ' i comma6.0 @@;
      claims(i) = _infile_;
   end;

   file log; 

   do i = 1 to 5, 996 to 1000;
      put i= claims{i}=;      
   end;

   stop;

run;

See also the documentation for the _INFILE_ and _FILE_ variables. On some cases, _FILE_ will be all you need.

0 Comments:

Post a Comment

<< Home