I needed to verify that values were in the order specified by a user in a dual selector control object contained in a SAS/AF frame.
My first thought was to load the selected values into a hash object then use a hash iterator object to spin thru the data using its .first() and .next() methods. That worked, but not as I would have expected. The values were all there but they were not in the order entered (natural order) of C, A, D, B but rather in this order: A, C, B, D.
The ordered: 'a' | 'd' (ascending or descending) attribute of the hash declaration would not work in this scenario so I ended up using a one dimensional _temporary_ array. See the below source code and output to better understand what I am describing.
data loadthis ( keep = valx ) ;
infile datalines eof = alldone ;
input valx $ @@ ;
n + 1 ;
output ;
return ;
alldone:
call symputx( 'acnt', n ) ;
return ;
datalines ;
C A D B
;
run ;
data out_array
out_hiter ;
if 0 then set loadthis /* prime the PDV */;
keep valx ;
/* load hash object and hash iterator object */
declare hash h(dataset:'loadthis') ;
declare hiter hi( 'h' ) ;
h.definekey( 'valx' ) ;
h.definedone() ;
/* dimension and populate array */
array aval[ &acnt ] $ _temporary_ ;
do until ( eof ) ;
set loadthis end = eof ;
rc + 1 ;
aval[ rc ] = valx ;
end ;
/* output array */
do rc = 1 to &acnt ;
valx = aval[ rc ] ;
output out_array ;
end ;
/* output hash object and hash iterator object */
rc = h.output( dataset:'out_hash' ) ;
rc = hi.first() ;
do while( rc = 0 ) ;
output out_hiter ;
rc = hi.next() ;
end ;
stop ;
run ;
No comments:
Post a Comment