Date: Thu, 29 Jun 2000 09:10:01 -0400 Ian Whitlock "SAS(r) Discussion" Ian Whitlock Re: Scan a record to see what variables are included, without rea ding the data into a dataset To: paula text/plain; charset="iso-8859-1"

Paula,

You have to have an alogrithm for locating the segment indicator. Without it, I think the general problem is unsolvable. With it the problem is easy. Let P denote the position of the field, SEGMENTS. Here are some examples.

P = nnn fixed position input @nnn segments \$char5. ;

P = last field on record (LRECL is length from INFILE statement or JCL) input @(lrecl-5) segments \$char5. ;

P = third variable of every segment array pos (5) _temporary_ ( ..... ) ; /* fill in with appropriate positions */ cnt = 0 ; do i = 1 to 5 ; input @(pos(i)) segments \$char5. @ ; if not verify ( segments , "0ABCDE" ) then do ; p = pos(i) ; cnt + 1 ; end ; end ; if cnt ^= 1 then stop ; input @p segments \$char5. ;

If you really don't know the algorithm to find the field, then there are three choices:

1) Ask the creator. 2) Dump 20 records from each tape with the LIST statement and look at them until the algorithm comes to mind. 3) Give the problem to an employee.

If you don't know how to write the program given an algorithm to locate the field, then ask how, after you have given the algorithm.

The problem might be solvable using extra information. Suppose I know that all fields are numeric. Then one could read in 32k characters at a time to locate any of the letters "ABCDE". But then I have just indicated the algorithm for locating the field.

Ian Whitlock <whitloi1@westat.com>

-----Original Message----- From: paula [mailto:icj808@USWEST.NET] Sent: Wednesday, June 28, 2000 9:35 PM To: SAS-L@LISTSERV.UGA.EDU Subject: Scan a record to see what variables are included, without reading the data into a dataset

My problem, which I hope is exciting, is as follows

I received tapes adding up to 500 variables per record. I am provided with a dictionary, neat and complete, detailing type, length of all the variables.

The problem is they are grouped into 5 segements, per record. The dictionary agains provides which segement includes which variables. The segements do not overlap, that is, each segement has variables that the others do not have. Inside each record, it is always one segement lined up after another.

I have been told that different tapes may have differenct segements included. For example, tape one may have segements 1, 2, 5 included, tape 2 has 3, 4, and tape 3 has 1, 3, 4 and so on. The good news is if a segement is determined to be present on a tape, all the variables defined to be included in the segement are included.

I have been told there is a field among the variables on each tape that tells which segements are on the tape. And that field is a 5 digit character field. It shows up in each record, just like an extra variable. For example, if it reads as A0C00, that means segements 1 and 3 are on the tapes, 0BCD0 means 2, 3, 4 and so on.

Without accessing this field, I can not know easily the info about the segements. But to get to that field, I need to get the segements and all the included fields read in by Input and Infile statements right first. So I am looking for ways to either scan across a record on a tape to know how many variables are on it totally, or, supposing I know the name of that variable, scan to read that field without reading in the whole record first.

TIA

Paula D

Back to: Top of message | Previous page | Main SAS-L page