BookmarkSubscribeRSS Feed
PeterClemmensen
Tourmaline | Level 20

Hej med jer.

 

Herunder er mine kode snippets fra min præsentation på SAS FANS fredag den 5. Marts 2021 om hash objektet i SAS.

 

Jeg har beskrevet koden overfladisk nedenfor, men kommentér gerne med spørgsmål eller kommentarer, så uddyber jeg gerne 🙂

 

Simpelt Hash Objekt Lookup

 

data En;
input ID;
datalines;
9  
1  
10 
3  
2  
4  
5  
8  
6  
7  
;

data To;
input ID num char $;
datalines;
8  80    Firs     
2  20    Tyve     
4  40    Fyrre    
10 100   Hundrede 
6  60    Tres     
;

data Tre;
   
   if _N_ = 1 then do;
      declare hash h(dataset : "To", hashexp : 20);   /* Deklarér hash object h med ID som key og num og char som data variable */
      h.definekey("ID");                              
      h.definedata("num", "char");
      h.definedone();
   end;

   set En;                                            /* Læs data set En sekventielt                                            */
 
   if 0 then set to;                                  /* Parameter type matching. Sikrer at num og char er i PDV                */
   call missing(num, char);                           /* Sæt num og char missing som udgangspunkt                               */

   rc = h.find();                                     /* Brug Find() Metoden til at slå num og char op på aktuel værdi af ID    */

run;

 

 

 

At Fjerne Duplicates med Hash Objektet

 

data want;
   
   if _N_ = 1 then do;        /* Deklarér hash object h med age som key variabel      */
      dcl hash h();
      h.definekey('age');
      h.definedone();
   end;

   set sashelp.class;         /* Læs sashelp.class sekventielt                        */

   if h.add() = 0;            /* Hvis vi kan indsætte age i h, har vi ikke mødt denne
                                 age før, så vi outputter. Ellers outputtes ikke      */
run;

 

 

Akkumuleret Variabel

 

data want;

   if _N_ = 1 then do;           /* Deklarér hash object h         */          
      dcl hash h();
      h.definekey('age');
      h.definedata('c');
      h.definedone();
   end;

   set sashelp.class;            /* Læs sashelp.class sekventialt  */

   if h.find() ne 0 then c = 1;  /* Hvis age findes i h, sæt c = 1 */
   else                  c + 1;  /* Ellers, læg 1 til c            */

   h.replace();                  /* Uanset hvad replacer vi c i h  */

run;

 

 

 

File Splitting - Hash Of Hashes

 

data _null_;
 
   dcl hash hh();                              /* Deklarér hash object hh                                                                   */
   hh.definekey ('age');                       /* Sæt age som key variabel                                                                  */
   hh.definedata('h', 'age');                  /* Sæt h og age som data variable. Dvs hh peger på hash objectet h                           */
   hh.definedone();                            /* Afslut deklaration af hh                                                                  */
   dcl hiter i('hh');                          /* Deklarér hash iterator objekt og link dette til hh                                        */

   do until (z);                               /* Brug DoW Loop til at læse sashelp.class sekventielt                                       */
      set sashelp.class end = z;              
      if hh.find() ne 0 then do;               /* Hvis vi ikke har mødt akutuel værdi af age før, gå ind i Do Blok                          */
         dcl hash h(dataset : 'sashelp.class(obs=0)', multidata:'Y');  /* Deklarér hash object h og tillad flere entries for samme key      */
         h.definekey('age');                   /* Sæt age som key variabel                                                                  */
         h.definedata(all : 'Y');              /* Sæt alle variable fra sashelp.class som data variable                                     */
         h.definedone();                       /* Afslut deklaration af h                                                                   */

         hh.add();                             /* Tilføj hash object instans til hh                                                         */
      end;                                     /* Do Blok slut                                                                              */
      h.add();                                 /* Uanset om vi har mødt akutuel værdi af age før peger vi nu på korrekt hash object h.  
                                                  Derfor kan vi tilføje aktuel værdi af age til h                                           */
   end;

   do while(i.next() = 0);                     /* Brug hash iterator til at iterere over alle entries i hh. Dvs over alle instanser af h    */
      h.output(dataset:cats('data_', age));    /* Output entries fra det 'aktive' hash object (Dvs det som hh peger på) til et SAS data set */
   end;                                        

run;

 

Vh Peter Clemmensen

 

 

SAS Innovate 2025: Register Now

Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!

Discussion stats
  • 0 replies
  • 667 views
  • 2 likes
  • 1 in conversation