SAS Programming Professionals,
Did you know that you can use a simple trick to determine how many records are in a flat file you have to process?
Flat files are one of the trickiest types of files to read into SAS for a number of reasons; and when they have varying numbers of records it can be a special challenge. Determining the number of records a flat file has can inform the way you process it.
Here is an example where we receive files from a client that are supposed to have either 22 or 28 records. Each file type is to be treated differently.
filename datafile "c:\temp\rawdata.dat";
infile datafile end=eof;
if eof then call symput("RECORDS",records);
put "This file has 22 lines.";
/* specific statements for when only 22 lines*/
put " This file has 28 lines.";
/* specific statements for when 28 lines*/
put "Bad case – Unexpected number of lines!";
/* specific statements for when not enough or
too many lines*/
We start out by specifying the file to be processed in a FILENAME statement. The DATA _NULL_ step reads every record in the flat file, keeping count of them in the RECORDS variable. When the DATA _NULL_ step completes reading the flat file, the count of records is stored in a macro variable aptly named RECORDS via CALL SYMPUT.
The DATA step uses a SELECT statement to determine which set of statements are used to process the flat file. We have a set of statements for when there are 22 records and a different set for when there are 28. The SELECT statement uses the SYMGETN to return the value stored in the RECORDS variable as a number. The subsequent WHEN statements execute when the number returned by SYMGETN is equal to 22 or 28, respectively.
With a couple of small changes, this example can be macrotized to handle a directory full of flat files that have varying numbers of lines.
Best of luck in all of your SAS endeavors!
(aka Michael A. Raithel)
Excerpt from the book: Did You Know That? Essential Hacks for Clever SAS Programmers
I plan to post each and every one of the hacks in the book to social media on a weekly basis. Please pass them along to colleagues who you know would benefit.