본문 바로가기
SAS/SAS 함수

【SAS 함수】 366. SCAN

by 기서무나구물 2021. 10. 10.

포스팅 목차

    o SCAN

     


    문자열에서 지정한 n번째 단어를 추출한다.

    Category: 문자함수

     


    문 법


    SCAN
    (string, count <, character-list <, modifier>>)

     

    Arguments

     

      Required Arguments

           string 

          문자형 상수, 변수 또는 표현식을 지정한다.

            count

           정수 값을 가지는 0 이 아닌 수치형 상수, 변수 또는 표현식이다. SCAN함수에서 선택할 문자열의 단어 수를 정수 값으로 지정한다. 예를 들어, 1은 첫 번째 단어를 표시하고, 2는 두 번째 단어를 나타낸다. 다음 규칙이 적용된다.

    • Count 가 양수인 경우 SCAN 함수는 문자열의 왼쪽에서 오른쪽 방향으로 단어의 개수를 카운트한다.
    • Count 가 음수인 경우 SCAN 함수는 문자열의 오른쪽에서 왼쪽 방향으로 단어의 개수를 카운트한다.

     


      Optional Arguments

            character-list

            문자 목록을 초기화하는 문자 표현식을 지정한다. 이 옵션은 필요에 따라 선택적으로 지정 할 수 있다. 이 목록은 단어를 구분하는 구분 기호로 사용하기 위한 문자를 지정한다. 다음 규칙이 적용된다.

    • 기본적으로 character-list 에 존재하는 모든 문자는 구분 기호로 사용된다.
    • modifier 를 지정하면 character-list 에 지정한 문자를 변경할 수 있다. 예를 들어, modifier 인수에 K 참조자(modifier, 조정자, 조정 옵션) 를 지정하면, character-list 에 존재하지 않는 모든 문자가 구분 문자로 사용된다.
    Tip 다른 참조자를 함께 사용하여 character-list에 더 많은 문자를 추가할 수 있다.

     

            modifier

             공백을 제외한 개별 문자로 SCAN 함수의 작업 방식을 제어하는 문자형 상수, 변수 또는 표현식을 지정한다. 공백은 무시된다. 다음 문자를 참조자로 사용한다.

    a or A 문자 목록에 알파벳 문자를 추가한다.
    b or B count 인수의 부호에 관계없이 왼쪽에서 오른쪽이 검색하는 일반적인 검색 방향과 반대로 오른쪽에서 왼쪽으로 검색하는 역방향 스캔을 진행한다.
    c or C 문자 목록에 제어 문자를 추가한다.
    d or D 문자 목록에 숫자를 추가한다.
    f or F 문자 목록에 밑줄과 영문자(VALIDVARNAME=V7을 사용하여 SAS 변수 이름의 첫 번째 문자로 사용 가능한 문자)를 추가한다.
    g or G 문자 목록에 그래픽 문자를 추가한다. 그래픽 문자는 종이에 인쇄할 때 이미지를 생성하는 문자이다.
    h or H 문자 목록에 가로(수평) 탭을 추가한다.
    i or I 대문자와 소문자의 차이를 무시한다. (동일하게 처리한다.)
    k or K 문자 목록에 포함되지 않은 모든 문자를 구분 기호로 처리되도록 한다. 즉, K를 지정하면 문자 목록에 존재하는 문자가 구분 기호로 처리되어서 생략되는 것을 방지하여 반환된 값에 그대로 유지된다. K를 지정하지 않으면 문자 목록에 있는 모든 문자가 구분 기호로 처리된다.
    l or L 문자 목록에 소문자를 추가한다.
    m or M 여러 개의 연속된 구분자(delimiters)와 string 인수의 선행(시작) 또는 후행(끝)에 위치한 구분자가 길이가 0인 단어를 하나의 값으로 반환 할 수 있도록 지정한다. ("A,,,A" 문자열은 4개의 단어( 'A' , '' , '' , 'A' )로 구분하고, ",A," 문자열은 3개의 단어('' , 'A' , '') 로 구분한다.) M 참조자를 지정하지 않으면 여러 개의 연속된 구분자는 하나의 구분자로 처리되고, string 인수의 문자열에서 시작 부분 또는 마지막 부분에 위치한 구분자는 무시된다.
    n or N 문자 목록에 숫자, 밑줄, 영문자(VALIDVARNAME=V7을 사용하여 SAS 변수 이름에서 사용 할 수 있는 문자)를 추가한다.
    o or O charlist 인수 및 modifier 인수를 SCAN 함수를 호출될 때마다 처리하지 않고 한 번만 처리한다. character-list 및 modifier 인수에 대한 변경이 필요 없는 루프에서 SCAN 함수를 호출할 때 DATA 단계(WHERE 절 제외) 또는 SQL 프로시저에서 O 수정자를 사용하면 SCAN 함수를 더 빠르게 실행할 수 있습니다. O 참조자(modifier)는 SAS 코드에서 SCAN 함수의 각 인스턴스에 개별적으로 적용되며, SCAN 함수의 모든 인스턴스에서 동일한 구분자 및 참조자를 사용하도록 처리하지 않는다.
    p or P 문자 목록에 구두점을 추가한다.
    q or Q 따옴표로 묶인 하위 문자열 내부에 존재하는 구분 기호를 무시한다. string 인수의 값에 짝을 이루지 않는 따옴표가 포함된 경우, 왼쪽에서 오른쪽으로 스캔할 때와 오른쪽에서 왼쪽으로 스캔할 때 서로 다른 단어가 생성된다.
    r or R SCAN 함수가 반환하는 단어에서 선행 및 후행 공백을 삭제한다. Q 와 R 참조자를 함께 지정하면 SCAN 함수는 단어의 첫 번째(선행) 와 마지막 공백(후행)을 먼저 제거한다. 그런 다음 단어가 따옴표로 시작하는 경우에는 SCAN은 단어에서 따옴표 한 쌍(겹, 레이어)을 제거한다.
    s or S 문자 목록에 공백 문자(공백, 가로/수평 탭, 세로/수직 탭, 캐리지 리턴, 라인 피드, 폼 피드)를 추가한다.
    t or T string 인수와 charlist 인수에서 마지막 후행 공백을 제거한다. 양쪽 문자 인수에서 후행 공백을 제거하는 하지 않고 하나의 문자 인수에서만 후행 공백을 삭제할 경우 T 수식자를 지정하여 SCAN 함수를 사용하는 대신에 TRIM 함수를 사용하라.
    u or U 문자 목록에 대문자를 추가한다.
    w or W 문자 목록에 인쇄 가능한(쓰기 가능한) 문자를 추가한다.
    x or X 문자 목록에 16진수 문자를 추가한다.

     


    상세 내용

     

    “구분자(Delimiter)” 와 “단어(Word)” 의 정의

    delimiter 는 단어를 구분하기 위해 사용되는 여러 문자 중 하나이다. charlist 인수와 modifier 인수를 사용하여서 구분자를 지정할 수 있다.

    Q 참조자를 지정하면 따옴표로 묶인 하위 문자열 내부의 구분자는 무시된다.

    SCAN 함수에서 "WORD"는 다음과 같은 모든 특성을 가진 하위(부분) 문자열이다.

    • 구분자 또는 문자열의 시작 부분으로 왼쪽 편에 경계가 설정된다.
    • 구분자 또는 문자열의 끝 부분으로 오른쪽 편에 경계가 설정된다.
    • 구분자를 포함하지 않다.

    문자열의 시작 또는 끝 부분에 구분자가 위치하고 있거나 문자열에 두 개 이상의 연속된 구분자(구분 기호)가 포함된 경우 단어의 길이는 0이 될 수 있다. 그러나, SCAN 함수에서 M 참조자를 지정하지 않으면 길이가 0인 단어는 무시된다.

    참고 "word"의 정의는 SCAN 함수와 COUNTW 함수에 공통으로 적용된다.

     


    ASCII and EBCDIC 환경에서 기본 구분자 사용하기

    두 개의 인수만 지정하여 SCAN 함수를 사용하는 경우, 기본 구분자는 컴퓨터가 사용하는 문자 체계(ASCII 또는 EBCDIC)에 따라 달라진다.

    • 컴퓨터에서 ASCII 문자 체계를 사용한는 경우 기본 구분자는 다음과 같다.

          blank ! $ % & ( ) * + , - . / ; < ^ |

           '^' 문자가 존재하지 않는 ASCII 환경에서 SCAN 함수는 '~' 문자를 대신 사용한다.

     

    • 컴퓨터에서 EBCDIC 문자 체계를 사용한는 경우 기본 구분자는 다음과 같다.

           blank ! $ % & ( ) * + , - . / ; < ¬ | ¢

    구분자로 사용할 문자를 지정하지 않고 modifier 인수를 사용하면, 사용되는 구분자는 modifier 인수에서 정의한 구분자 속성만 사용된다. 이 경우 ASCII 과 EBCDIC 환경의 기본 구분자 목록은 사용되지 않는다. 즉, 참조자는 charlist 인수에서 명시적으로 지정된 구분자 목록에 추가된다.

     


    결과의 길이

    DATA 단계에서 다수의 변수는 고정 길이를 가진다. SCAN 함수에 의해 반환되는 단어가 해당 단어의 길이보다 긴 고정 길이의 변수에 할당된 경우 해당 변수의 값은 반환되는 단어의 길이보다 큰 나머지 부분은 공백으로 채워진다. 매크로 변수는 가변 길이이기 때문에 공백으로 채워지지(padded with blanks) 않는다.

    SCAN 함수에 의해 반환되는 단어의 최대 길이는 단어의 이름을 호출하는 환경에 따라 달라진다.

    • DATA 스텝에서 SCAN 함수가 아직 길이가 할당되지 않은 변수에 값을 반환하는 경우, 해당 변수에는 첫 번째 인수의 길이가 할당된다. 이 동작은 이전 SAS 릴리스의 동작과 다르다. 이전 릴리스에서는 길이가 200인 변수를 생성한 코드가 예상보다 긴 길이의 변수를 생성했을 수 있다. SCAN 함수가 첫 번째 인수의 길이와 다른 값을 변수에 할당을 해야 하는 경우 LENGTH 구문을 사용하라.
    • 연산자 또는 다른 함수를 포함하는 표현식에서 SCAN 함수를 사용하는 경우 SCAN 함수에 의해 반환되는 단어는 WHERE 절에서 사용되는 경우를 제외하고 최대 32,767자의 길이를 할당할 수 있다. WHERE 절의 경우 최대 길이는 200자이다.
    • SQL 프로시저 또는 모든 프로시져의 WHERE 절에서 SCAN 함수에 의해 반환되는 단어의 최대 길이는 200자이다.
    • 매크로 프로세서에서 SCAN 함수가 반환하는 단어의 최대 길이는 65,534자이다.

    SCAN 함수에 의해 반환되는 단어의 최소 길이는 M 참조자가 지정되었는지 여부에 따라 달라진다.

     


    M 참조자와 함께 SCAN 함수 사용하기

    M 참조자를 지정하면 문자열에 속한 단어의 개수는 문자열에 속한 구분자의 개수에 1을 더한 값으로 정의된다. 그러나, Q 참조자를 지정하면 따옴표 내부에 존재하는 구분자는 무시된다.

    M 참조자를 지정하면 SCAN 함수는 다음 조건 중 하나에 해당하는 경우 길이가 0인 단어를 반환한다.

    • 문자열이 구분자 시작한 상태에서 첫 번째 단어를 요청하는 경우.
    • 문자열이 구분자로 끝나는 상태에서 마지막 단어를 요청하는 경우.
    • 문자열에 두 개의 연속된 구분자가 포함되어 있고, 이 두 구분자 사이에 존재하는 단어를 요청하는 경우

     


    M 참조자를 지정하지 않은 SCAN  함수 사용하기

    M 참조자를 지정하지 않은 경우, 문자열에 존재하는 단어의 개수는 구분자로 구분되는 연속된 비 구분자(구문 문자)의 최대 하위 문자열의 개수로 정의된다. 그러나, Q 참조자를 지정하면 따옴표 내부에 존재하는 구분자는 무시된다.

    M 참조자를 지정하지 않으면 SCAN 함수는 다음과 같이 작동한다.

    • 문자열의 선행 또는 후행(마지막)의 구분자를 무시한다.
    • 두 개 이상의 연속된 구분자를 하나의 구분자로 처리한다.

    문자열에 구분자 이외의 문자가 포함되어 있지 않거나 문자열에 속한 단어의 개수보다 절대값이 큰 count를 지정하는 경우 SCAN 함수는 다음 중 하나의 항목을 반환한다.

    • 데이터 스텝에서 SCAN 함수를 호출하는 경우 하나의 공백.
    • 매크로 프로세서에서 SCAN 함수를 호출하는 경우 길이가 0인 문자열.

     


    Null 인수 사용하기

    SCAN 함수에서 문자 인수를 NULL로 지정할 수 있다. null 인수는 길이가 0인 문자열로 취급된다. 수치형 인수는 null로 설정할 수 없다.

     


    참 고

    n이 음수라면 문자열 뒤에서부터 검색을 시작한다.

    구분자를 별도로 지정하지 않으면 아래 문자들을 구분자로 처리한다.

           blank . < ( + & ! $ * ) ; ^ - / , % |

     


    관련 함수

    함수명 함수내용
    CALL SCAN 문자열에서 주어진 단어의 위치와 length 반환한다. 
    CALL SCANQ Quotation Mark에 의해 구분된 구분자는 무시하고, 문자에서 주어진 단어의 위치와 length 반환한다.
    COUNTW 문자열에서 지정한 단어의 갯수를 카운트한다.
    FIND 지정한 문자열 안에 지정 문자 위치를 반환한다.
    FINDC 지정한 문자열 안에 지정 문자의 존재성에 대한 결과 반환한다.
    FINDW 문자열에서 지정한 단어의 문자 위치를 반환하거나 문자열에 존재하는 단어의 갯수를 반환한다.
    INDEX 문자열에서 해당 문자열 단위로 위치를 검색하여 첫 번째 위치를 반환한다.
    INDEXC 문자열에서 해당 문자 단위로 위치를 검색하여 첫 번째 위치를 반환한다.
    INDEXW 문자열에서 해당단어 단위로 위치 검색하여서 첫 번째 단어 위치를 반환한다. excerpt는 단어 앞뒤의 공백은 제거후 검색한다.
    SCAN 문자열에서 지정한 n번째 단어를 추출한다.
    SCANQ quotation marks로 둘러쌓인 경우 구분자를 무시하고, 문자열로부터 n번째 단어를 추출한다.
    VERIFY
    지정한 문자열과 대상 문자열을 비교하여 지정한 문자열이 존재하지 않는 문자의 첫 번째 위치를 반환한다.

     


    예 제

    구분자를 기준으로 앞에서 3번째 위치한 값과 뒤에서 3번째 위치한 값을 추출한다.

    SAS Statements
    data SCAN;
         arg  = 'ABC.DEF(X=Y)';
         word = scan(arg,3);
         put word;
    
         word1 = scan(arg,-3);
         put word1;
    run;

     

    Results
    arg          word    word1  
    ABC.DEF(X=Y)  X=Y      ABC

     


    SAS 함수(SAS Function) 리스트 링크

     

    엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크

     

    SAS 데이터 스텝 구문 리스트(SAS Data Step Statement)
    반응형

    'SAS > SAS 함수' 카테고리의 다른 글

    【SAS 함수】 368. SDF  (0) 2021.10.10
    【SAS 함수】 367. SCANQ  (0) 2021.10.10
    【SAS 함수】 365. SAVING  (0) 2021.10.10
    【SAS 함수】 364. RXPARSE  (0) 2021.10.10
    【SAS 함수】 363. RXMATCH  (0) 2021.10.10

    댓글