BookmarkSubscribeRSS Feed

[HASH Object] 문자열이 다양한 길이로 존재하거나 또는 와일드카드(wildcards)를 포함하는 경우에 대상 문

Started ‎06-12-2020 by
Modified ‎06-12-2020 by
Views 135

* 제목 : 문자열이 다양한 길이로 존재하거나 또는 와일드카드(wildcards)를 포함하는 경우에 대상 문자열과 가장 유사한 값을 선택하는 방법;

 

* Sample 25977: Determine the closest match for a target string when values of varying lengths, or values containing wildcards;

 

* 출처 : http://support.sas.com/kb/25/977.html;

 

* 목적 : 문자열의 끝에 와일드카드가 존재하여서 다양한 길이의 관측값이 존재하는 두 번째 테이블(Source)에서 특정 문자열을 기준으로 효율적으로 테이블 검색 작업을 수행한다.;

 

* 참고 : 와일드-카드wild card;

         /* <컴퓨터> 운영 체제 명령어에서 파일의 이름을 지정할 때에, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호. 

            예를 들어 ‘*’는 임의의 문자열을 나타내고, ‘?’는 임의의 한 문자를 나타낸다. */

 

 

data source;

  input x $ y $;

datalines;

12345678 xyz

123456** abc

12345*** efg

1234**** hij

;

 

PROC SORT DATA=SOURCE OUT=TEST;

     BY DESCENDING X;

RUN;

 

/* 조회 작업을 수행할 데이터 세트 생성. 

   SOURCE 데이터 세트에서 여러 개의 값 중에서 가장 유사한 값을 최적으로 검색하여서 해당 관측치의 Y의 값을 획득한다. */                                                                                                                                  

data target;

  input x $ ;

datalines;

12345678

12345601

12345602

12345001

12345002

12340001

12340002

11111111

12340003

;

 

data out;

     length x y $ 8;

     /* 데이터 스텝의 첫 번째 반복 작업에서 Hash 테이블 H를 생성하고 인스턴트화 한다.

        DATASET: 인수 태그를 사용하여서 WORK.SOURCE 데이터 세트를 Hash 테이블 H에  로딩한다.

        HASH 테이블 검색을 위하여 DEFINEKEY 매소드를 사용하여서 x 변수를 조회 키 변수로 정의한다.

        HASH 객체에 사용자가 지정한 내림차순 방식으로 x변수를 로드하기 위하여 ORDERED: 인수를 사용한다.

        정렬 방식을 내림차순으로 지정하는 것은 SOURCE 데이터 세트의 값 중에서 가장 유사한 값을 선택하기 위한 프로그램의 핵심 기법이다.

        DEFINEDATA 매소드를 사용하여서 키와 연관된 값으로 X,Y 변수를 데이터 항목으로 정의한다.

        HASH 반복기(Iterator) 이름을 h_iter로 선언한다. 

        HASH 반복기는 HASH 객체에서 개별 키 값을 기준으로 반복 작업을 수행한다. */

 

     if _n_=1 then do;

        declare hash h(dataset:'source', ordered:'descending');

        h.definekey('x');

        h.definedata('x','y');

        declare hiter h_iter('h');

        h.definedone();

        call missing(x, y);

     end;

 

     /* HASH 오브젝트에서 데이터 값이 반환 될 때, 반환되는 X변수의 값이 TARGET 데이터 세트의 X 변수의 값을  

        변경하지 않도록 TARGET 데이터 세트의 X 변수의 이름을 TX로 변경한다. */

     set target(rename=(x=tx));

     rc=h_iter.first();

     do while (rc=0);

        if substr(tx,1,length(compress(x,'*')))=compress(x,'*') then leave;

        /* 문자열에서 '와일드 카드'를 제외한 문자열의 길이를 기준으로 비교 작업을 수행하여서 일치하지 않는 경우 

           다음으로 가장 일치하는 값을 검색하기 위하여 다음 키 값을 기준으로 위의 비교 작업을 반복하여서 수행한다. */

        rc1=h_iter.next();

 

        /* 일치하는 값을 찾지 못하여서 반복 작업을 수행하기 위한 KEY 값이 더 이상 존재안하는 경우 Y 변수의 값을 'not' 으로 저장하고,

           해당 관측치에 대한 처리 작업을 중지한다. */

        if rc1 ne 0 then do;

           y='not';

           leave;

        end;

     end;

run;

 

proc print;

run;

 

**********************************************************

- 통계분석연구회 

- 카페 : http://cafe.daum.net/statsas

- 통계분석연구회 페이지 : https://www.facebook.com/statsas

- 통계분석연구회(Statistics Analysis Study) 그룹 :https://www.facebook.com/groups/statsas/

#통계 #빅데이터 #통계분석연구회 

Version history
Last update:
‎06-12-2020 05:34 AM
Updated by:
Contributors

hackathon24-white-horiz.png

The 2025 SAS Hackathon Kicks Off on June 11!

Watch the live Hackathon Kickoff to get all the essential information about the SAS Hackathon—including how to join, how to participate, and expert tips for success.

YouTube LinkedIn

Article Labels
Article Tags