Hi Shayan2012, Welcome to SAS. As you are new to SAS I have broken down how the code works within the comments, however if there is something you don't understand please let me know. Loading a dataset into a hash object is limited by the amount of memory you have available. You haven't mentioned in your post exactly how large the list is, so run the below code and see how you progress. /*SET UP TEST DATA*/ DATA HAVE; LENGTH LINE1 $200; INFILE DATALINES; INPUT LINE1 $; DATALINES; HHHHHHHHHHHHGEORGEGARRY 5646546465HARRYGARRYBARRY ; RUN; /*SET UP LIST OF VALUES WE WISH TO LOOK FOR*/ DATA LIST; LENGTH NAMESLIST $7; NAMESLIST = "HARRY"; OUTPUT; NAMESLIST = "BARRY"; OUTPUT; NAMESLIST = "GEORGE"; OUTPUT; NAMESLIST = "GARRY"; OUTPUT; RUN; DATA LOOKUP; /*LOAD LIST DATASET INTO A HASH TABLE AND DECLARE THE ITERATOR*/ IF _N_ = 1 THEN DO; LENGTH NAMESLIST $6; DECLARE HASH HA(DATASET:"LIST"); DECLARE HITER HI("HA"); HA.DEFINEKEY("NAMESLIST"); HA.DEFINEDATA("NAMESLIST"); HA.DEFINEDONE(); CALL MISSING(NAMESLIST); END; /*READ IN HAVE DATASET AS NORMAL*/ SET HAVE; /*READ IN THE FIRST RECORD IN HASH TABLE*/ RC = HI.FIRST(); /*CREATE AN ARRAY CALLED _COUNT CONTAIN VARIABLES COUNTA TO COUNTZ*/ ARRAY _COUNT {*} COUNTA COUNTB COUNTC COUNTD COUNTE COUNTF COUNTG COUNTH COUNTI COUNTJ COUNTK COUNTL COUNTM COUNTN COUNTO COUNTP COUNTQ COUNTR COUNTS COUNTT COUNTU COUNTV COUNTW COUNTX COUNTY COUNTZ; CALL MISSING(COUNTA,COUNTB,COUNTC,COUNTD,COUNTE,COUNTF,COUNTG,COUNTH,COUNTI, COUNTJ,COUNTK,COUNTL,COUNTM,COUNTN,COUNTO,COUNTP,COUNTQ,COUNTR, COUNTS,COUNTT,COUNTU,COUNTV,COUNTW,COUNTX,COUNTY,COUNTZ); DO WHILE (RC = 0); /*IF THE NAME IN THE HASH TABLE RECORD APPEARS IN THE STRING FROM THE HAVE DATASET THEN*/ IF INDEX(LINE1,TRIM(NAMESLIST)) ~= 0 THEN DO; /*SET NUMBER OF ITERATIONS REQUIRED TO MOVE THROUGH ALL VARIABLES WITHIN THE ARRAY*/ DO I = 1 TO 26; /*IF THE LAST VALUE IN THE VARIABLE ARRAY APPEARS AS THE FIRST CHARACTER OF THE VALUE IN THE NAMELIST VARIABLE THEN */ IF TRIM(SUBSTR(VNAME(_COUNT{I}),6,1)) = TRIM(SUBSTR(NAMESLIST,1,1)) THEN DO; /*ADD 1 TO THE RELEVANT ARRAY ELEMENT*/ _COUNT{I} = SUM(_COUNT{I},1); /*ONCE THE NAME IS FOUND THEN LEAVE THE DO LOOP*/ LEAVE; END; END; END; /*READ IN THE NEXT RECORD FROM THE HASH TABLE*/ RC = HI.NEXT(); END; DROP I; RUN;
... View more