본문 바로가기
SAS/SAS 구문사전

【SAS Statement】 INPUT 구문

by 기서무나구물 2022. 2. 1.

포스팅 목차

    o INPUT 구문

     


    1. 목 적 

      INPUT 구문은 입력 데이터 레코드에서 관측치 값을 변수로 읽으려는 방법을 정의하고, 입력값을 해당 SAS 변수에 할당한다. 외부 파일 또는 내부 데이터에서 원시 데이터를 읽기 위하여 INPUT 구문을 사용한다. 

    데이터가 외부파일에 존재하면, INFILE 구문에서 외부파일을 지정할 수 있다. INFILE 구문은 데이터 레코드를 읽는 INPUT 구문 전에 실행되어야 한다. 데이터가 내부데이터에 존재하면, DATALINES 구문은 프로그램 내부에서 데이터 라인 바로 앞에 위치해야 한다.

     


    2. 문 법 


    INPUT
    <@|@@>;


     

    1) 인수를 사용하지 않는 경우

       인수를 지정하지 않은 INPUT 구문은 Null INPUT 구문이라고 하고, 다음과 같은 역할을 수행한다.

    • 변수를 생성하지 않고 데이터 레코드를 입력 버퍼로 가져온다.
    • 후행 @ 와 이중 후행 @ 에 의해 유지되고 있는 입력데이터 레코드를 해제한다.

     

    2) Specification(s)

       다음을 포함할 수 있다.

     

    (1) Variable

       입력값이 할당되는 변수를 지정한다.

     

    (2) (variable-list)

       입력값이 할당되는 변수의 리스트를 지정한다.

     

    요구사항 : 입력형식리스트(informat-list) 변수리스트(variable-list) 뒤에 존재해야 한다.
    관련사항 : 변수와 입력형식을 그룹화하기

     

    (3) $

       변수를 문자변수로 저장하도록 지정한다.

     

    Tip : 이전에 변수가 문자로 저장되었으면, $ 지정 필요가 없다.
    관련사항 : 예제1 : 단일 INPUT 구문에서 다수의 입력 형식 사용

     

    (4) Pointer-control

       입력 버퍼 내부에서 지정된 라인 또는 열로 입력 포인터를 이동시킨다.

     

    참고 : 포인터 조절자 포인터 조절자

     

    (5) Column-specifications

       읽기 위한 값이 위치하고 있는 입력 레코드의 열을 지정한다. 이 방법으로는 표준 문자와 숫자 데이터를 올바르게 읽을 수 있다. (열입력방식)

     

    Tip : 입력형식(Informats) 적용되지 않는다. 단지 방법으로는 표준 문자와 숫자 데이터를 올바르게 읽을 있다.
    참고 : 열입력 방식
    주요기능 : 예제1 : 단일 INPUT 구문에서 다수의 입력 형식 사용

     

    (6) Format-modifier

       수정된 목록입력 방식을 지정하고, 입력 값에서 에러가 발생할 때에 SAS 로그에 기록되는 정보의 양을 관리한다. (수정된 목록입력방식)

     

    Tip : 단순 목록 입력 방식으로 읽을 없는 데이터에 대하여 수정된 목록입력방식을 사용하라.
    참고 : 목록 입력 방식 사용 시기
    참고 : 에러 출력에 대한 출력형식 수정자
    주요기능 : 예제6. 문자형 변수를 사용하여 포인터 위치 정하기

     

    (7) Informat.

       변수 값을 읽기 위하여 사용되는 입력형식(informat)을 지정한다. (포맷 입력 방식과 목록 입력 방식)

     

    Tip : 입력형식을 지정하여 데이터를 읽기 위하여 수정된 목록입력 방식을 사용 있다. 수정된 목록입력 방식은 데이터를 입력형식을 사용하여 읽을 필요는 있지만 값이 열을 기준으로 정렬되지 않아서 포맷입력 방식을 사용 없는 경우에 유용하다.
    참고 : 포맷 입력 방식 목록 입력 방식
    주요기능 : 예제2 : 입력형식 리스트 사용하기

     

    (8) (informat-list)

       선행하는 변수 리스트의 값을 읽기 위하여 사용되는 입력형식 리스트를 지정한다. 입력형식리스트(informat-list)는 변수리스트(variable-list) 뒤에 존재해야 한다.

     

    제한사항 : 입력형식 리스트(informat-list) 변수리스트(variable-list) 뒤에 존재해야 한다.
    참고 : 변수와 입력형식을 그룹화하기

     


    3) @

       데이터 스텝의 동일 반복 내에서 다음 INPUT 구문을 실행할 때까지 입력 레코드를 유지한다. 이 행고정 지정자(line-hold specifier) 는 후행@라 불린다. 후행@는 이후의 INPUT 구문이 자동으로 현재 입력 레코드를 해제하고, 다음 차례의 레코드를 입력 버퍼로 읽는 것을 방지한다. 동일한 레코드를 여러 번 읽을 필요가 있는 경우에 유용하다.

     

    제한사항 : 후행@ INPUT 구문에서 마지막 항목으로 지정해야 한다.
    Tip : 후행@ 이후의 INPUT 구문이 자동적으로 현재 입력 레코드를 해제하고, 다음 차례의 레코드를 입력 버퍼로 읽는 것을 방지한다. 동일한 레코드를 여러 읽을 필요가 있는 경우에 유용하다.
    관련사항 : 행고정 지정자 사용하기
    주요기능 : 예제3 : 입력 버퍼에서 레코드 유지하기

     

    4) @@

       데이터 스텝의 반복수행과정 중에서 다음 반복 과정의 INPUT 구문을 실행할 때까지 현재 입력 레코드를 유지한다. 이 행고정지정자(line-hold specifier)를 이중 후행@라고 한다.

    이중 후행@는 개별 입력 라인이 여러 개의 관측치 값을 소유하고 있거나 또는 데이터 스텝의 다음 반복에서 레코드를 다시 읽을 필요가 있는 경우에 유용하다.

     

    제한사항 : 이중 후행@ INPUT 구문에서 마지막 항목이어야 한다.
    Tip : 이중 후행@ 개별 입력 라인이 여러 개의 관측치 값을 소유하고 있거나 또는 데이터 스텝의 다음 반복에서 레코드를 다시 읽을 필요가 있는 경우에 유용하다.
    관련사항 : 행고정 지정자 사용하기
    주요기능 : 예제4 데이터 스텝의 반복수행 과정에서 현재 레코드 유지하기

     


    5) 열포인터조절자(Column Pointer Controls)

    (1) @n

       포인터를 첫 번째 열을 기준으로 n번째 열로 이동한다.

     

    범위 : 양수
    Tip : n 정수가 아니면, SAS 소수 부분을 잘라내고, 정수 값을 사용한다. 만약 n 또는 음수라면, 포인터가 번째 열로 이동한다.
    예제 : @15 포인터를 15열로 이동시킨다.

    input @15 name $10.;
    주요기능 : 예제 7: 포인터를 (왼쪽) 이동하기

     

    (2) @numeric-variable

       포인터를 첫 번째 열을 기준으로 Numeric-variable의 값에 지정된 열로 이동한다.

     

    범위 : 양수
    Tip : numeric-variable 정수가 아니면, 소수 부분을 잘라내고, 정수 값을 사용한다. 만약 numeric-variable 또는 음수라면, 포인터가 번째 열로 이동한다.
    예제 : 변수A 값은 포인터를 15열로 이동시킨다.

    a=15;
    input @a name $10.;
    주요기능 : 예제5. 수치형 변수를 사용하여 포인터 위치 정하기

     

    (3) @(expression)

       포인터를 첫 번째 열을 기준으로 표현식의 값에 지정된 열로 이동한다.

     

    제한사항 : 표현식의 결과는 양수이어야 한다.
    Tip : 표현식이 정수가 아니면, 소수 부분을 잘라내고, 정수 값을 사용한다. 만약 표현식이 또는 음수라면, 포인터가 번째 열로 이동한다.
    예제 : 표현식은 포인터를 15열로 이동시킨다.

    b=5;
    input @(b*3) name $10.;

     

    (4) @’character-string’

       입력 레코드에서 지정된 문자열을 검색하고, 검색된 문자열 뒤의 첫 번째 열로 포인터를 이동한다.

     

    (5) @character-variable

       입력 레코드에서 Character-variable의 값에 지정된 문자열을 검색하고, 검색된 문자열 뒤의 첫 번째 열로 포인터를 이동한다.

     

    예제 : 다음 문장은 먼저 문자형 변수 WEEKDAY 먼저 읽는다. 번째 @1 포인터를 다시 입력 라인의 시작으로 이동한다. SALES 변수의 값은 해당하는 WEEKDAY 변수의 값을 검색한 후에 문자열 뒤의 번째 공백이 아닌 열에서 값을 읽는다.

    input @1 day 1. @5 weekday $10.
              @1 @weekday sales 8.2;
    주요기능 : 예제6. 문자형 변수를 사용하여 포인터 위치 정하기

     

    (6) @(character-expression)

       입력 레코드에서 문자 표현식(Character-expression)에 지정된 문자열을 검색하고, 검색된 문자 표현식 뒤의 첫 번째 열로 포인터를 이동한다.

     

    주요기능 : 예제6. 문자형 변수를 사용하여 포인터 위치 정하기

     

    (7) +n

       포인터를 현재 열을 기준으로 n개 열만큼 오른쪽으로 이동한다.

     

    범위 : 양수 또는
    Tip : n 정수가 아니면, 소수 부분을 잘라내고, 정수 값을 사용한다. 값이 입력 버퍼의 길이보다 경우에 포인터는 다음 레코드의 번째 열로 이동한다.
    예제 : 다음 문장은 23번째 열로 포인터를 이동하여서 23~26열에서 LENGTH변수의 값을 읽고, 포인터를 오른쪽으로 5 열만큼 이동한다. 그리고, 32~35열에서 WIDTH변수의 값을 읽는다.

    input @23 length 4. +5 width 4.;
    주요기능 : 예제 7: 포인터를 (왼쪽) 이동하기

     

    (8) +numeric-variable

       포인터를 현재 열을 기준으로 수치형 변수(Numeric-variable)의 값에 지정된 열만큼 오른쪽으로 이동한다.

     

    범위 : 양수, 음수, 또는
    Tip : 수치형 변수(Numeric-variable) 정수가 아니면, 소수 부분을 잘라내고, 정수 값을 사용한다. 수치형 변수가 음수이면, 포인터는 (왼쪽) 이동한다. 포인터가 이동하면서 위치가 1보다 적어지면, 포인터는 번째 열로 이동한다. 값이 영이면, 포인터는 이동하지 않는다. 값이 입력 버퍼의 길이보다 경우에 포인터는 다음 레코드의 번째 열로 이동한다.
    주요기능 : 예제 7: 포인터를 (왼쪽) 이동하기

     

    (9) +(expression)

       포인터를 현재 열을 기준으로 표현식(Expression)의 값에 지정된 열만큼 오른쪽으로 이동한다.

     

    범위 : 표현식의 결과는 양수, 음수 또는 Zero이어야 한다.
    Tip : Expression 정수가 아니면, SAS 소수 부분을 잘라내고, 정수 값을 사용한다. 표현식의 결과값이 음수이면, 포인터는 (왼쪽) 이동한다. 현재 위치가 1보다 적어지면, 포인터는 번째 열로 이동한다. 값이 영이면, 포인터는 이동하지 않는다. 값이 입력 버퍼의 길이보다 경우에 포인터는 다음 레코드의 번째 열로 이동한다.

     


    6) 행포인터조절자(Line Pointer Controls)

       하나의 관측치가 여러 개의 레코드에 입력되어 있는 자료를 순차적(/)으로 또는 비순차적(#)으로 읽기 위하여 사용된다.

     

    (1) #n

       포인터를 해당 관측치가 시작되는 행의 위치를 기준으로 n번째 레코드로(절대위치) 이동한다.

     

    범위 : 양수
    영향 : INFILE 구문에서 N=옵션은 INPUT 구문이 읽을 레코드의 수와 데이터 스텝의 개별 반복 후에 입력 포인터의 위치에 영향을 준다.
    예제 : #2 포인터를 현재 위치에서 번째 레코드로 이동하여 3 4번째 열에서 ID 변수에 대한 값을 읽는다.


    input name $10. #2 id 3-4;

     

    (2) #numeric-variable

       포인터를 해당 관측치가 시작되는 행의 위치를 기준으로 수치형 변수(Numeric-variabel)의 값에 지정된 레코드로 이동한다.

     

    범위 : 양수
    Tip : numeric-variable 값이 양수가 아니면 SAS 소수값을 제외하고 정수 부분을 사용한다.

     

    (3) #(expression)

       포인터를 해당 관측치가 시작되는 기준 행의 위치를 기준으로 표현식의 값에 지정된 레코드로 이동한다.

     

    범위 : 표현식 결과값은 양수이어야 한다.
    Tip : 표현식 값이 양수가 아니면, SAS 소수값을 제외하고 정수 부분을 사용한다.

     

    (4) /

       바로 다음 입력 레코드의 첫 번째 열로 포인터를 이동한다.

     

    예제 : NAME AGE변수에 대한 값을 번째 입력 레코드에서 읽은 후에 번째 레코드로 포인터를 이동하여 3-4번째 열에서 ID 변수의 값을 읽는다.

    input name age / id 3-4;

     


    7) 에러 출력에 대한 출력형식 수정자

    (1) ?

       비유효한 데이터값이 발생했을 경우에 비유효 데이터의 출력을 제어한다.

     

    (2) ??

       비유효 데이터값이 발생했을 경우에 메시지와 해당 입력 라인의 출력을 제어한다. 비유효 관측치가 발생하여도 자동 변수 _ERROR_은 1로 설정되지 않는다.

     


    3. 범 주

    SAS 기본 구문 (파일 처리 구문)

     

    4. 상세 설명

     

    INPUT 구문 사용 시기

    외부 파일 또는 내부 데이터에서 원시 데이터를 읽기 위하여 INPUT 구문을 사용한다.

     

    데이터가 외부파일에 존재하면, INFILE 구문에서 외부파일을 지정 있다. INFILE 구문은 데이터 레코드를 읽는 INPUT 구문 전에 실행되어야 한다. 데이터가 내부데이터에 존재하면, DATALINES 구문은 프로그램 내부에서 데이터 라인 바로 앞에 위치해야 한다. 데이터가 세미콜론을 포함하면, 데이터 라인 앞에서 DATALINES4 구문을 사용하라. 원시 데이터를 읽기 위한 데이터 스텝은 다중 INPUT 구문을 사용 있다.

     

    INPUT 구문 앞의 INFILE 구문에 DATALINES 구문을 파일이름으로 지정하여 내부 데이터를 읽을 있다. INFILE 구문에서 DATALINES 구문을 사용하여 내부데이터를 읽으면서 INFILE 구문에서 활용되는 대부분의 옵션을 사용 있다.

     

    SAS데이터 세트에 저장된 데이터를 읽기 위해서는 SET 구문을 사용하라. 데이터베이스 또는 다른 소프트웨어로부터 생성된 PC 파일 형식 데이터를 읽기 위하여, LIBNAME 구문으로 데이터에 접근한 후에 SET 구문을 사용하라. 상세한 정보는 SAS/ACCESS 도움말 참조.

     

    운영환경정보 : z/OS 생성된 LOG파일과 PROC PRINTTO 파일화된 LOG파일은 번째 열에 ASA 제어 문자를 포함한다. INPUT 구문을 사용하여서 Z/OS에서 생성된 LOG파일을 읽기 위하여 입력 또는 포인터 조절자를 사용하는 경우에는 ASA 제어 문자를 고려해야 한다.

     

    입력 방식

    INPUT 구문에서 레코드의 값을 기술하기 위한 4가지 방식이 있다.

     

    • 열입력(column)
    • 단순목록입력 / 수정목록입력(Simple list and modified list)
    • 포맷입력(formatted)
    • 변수이름 지정입력(named)

     

    위의 입력 스타일 중에 하나의 방식으로 개별 변수를 읽는다. INPUT 구문은 입력 레코드에서 데이터 값의 배치에 따라서 사용 가능한 입력 방식의 일부 또는 모든 방식을 사용 있다. 그러나, 변수이름 지정입력 방식이 INPUT 구문에서 사용되면, 이후의 값에 대하여 다른 입력 방식을 사용 없다.

     

    1) 열 입력 방식(Column Input)

    INPUT 구문에서 변수의 이름 다음에 번호를 지정한다. 숫자는 입력 데이터 레코드에서 변수의 값이 존재하고 있는 위치를 알려준다.

    input name $ 1-8 age 11-12;

     

    INPUT 구문은 아래의 데이터 레코드를 읽는다.

     

    ----+----1----+----2----+
    
    Peterson  21
    
    Morgan    17

     

    NAME변수는 문자형 변수이므로 변수 이름과 번호 사이에 $ 기호를 작성해야 한다.

     

    2) 목록입력 방식 (List Input)

    INPUT 구문에서 단순하게 변수 이름을 나열한다. 문자형 변수 이름 뒤에는 $ 기호를 작성한다.

    input name $ age;

     

    INPUT 구문은 공백으로 구분되거나 열을 기준으로 정렬된 데이터 (사이에 적어도 하나의 공백을 가진) 읽을 있다.

     

    ----+----1----+----2----+
    
    Peterson  21
    
    Morgan  17

     

    3) 포맷입력 방식(Formatted Input)

    INPUT 구문에서 변수의 이름 뒤에 입력형식을(informat) 작성한다. 입력형식은 입력 값의 데이터 유형과 필드의 길이를 정의한다. 입력형식을 사용하여 비표준화 데이터(압축된 10진수 형식(Pacted decimal) 또는 콤마와 같은 특수 문자를 포함한 숫자) 저장된 데이터를 읽을 있다.

     

    input name $char8. +2 income comma6.;

     

    INPUT 구문은 아래 데이터 레코드를 올바르게 읽는다.

     

    ----+----1----+----2----+
    
    Peterson  21,000
    
    Morgan    17,132

     

    +2 포인터 조절자는 입력 포인터를 INCOME변수값에 해당하는 필드로 이동시킨다. 상세한 내용은 “INPUT 구문, 입력형식 지정 입력방식참조.

     

    4) 변수이름 지정입력 방식 (Named Input)

    변수 이름 뒤에 등호 부호를 작성한다. 입력 레코드에서 변수의 이름과 등호를 검색한다.

    input name= $ age=;

     

    INPUT 구문은 아래의 데이터 레코드를 올바르게 읽는다.

     

    ----+----1----+----2----+
    
    name=Peterson age=21
    
    name=Morgan age=17

     


    단일 INPUT 구문에서 다중 입력방식 사용하기

    INPUT 구문에서 여러 입력 형식의 일부 또는 모든 입력방식을 혼합하여 사용 있다.

     

    input idno name $18. team $ 25-30 startwght endwght;

     

    다음 INPUT 구문은 아래의 데이터 레코드를 읽는다.

     

    ----+----1----+----2----+----3----+----
    
    023 David Shaw         red    189 165
    
    049 Amelia Serrano     yellow 189 165

     

    목록입력 방식으로 IDNO, STARTWGHT, ENDWGHT 변수의 값을 읽고, NAME변수의 값은 포맷 지정 입력 방식을 사용하고, TEAM변수의 값은 열입력 방식을 사용한다.

    참고 : INPUT 구문에서 변수이름 지정입력 방식을 사용하면 이후에 다른 입력 방식을 사용 없다.

     


    포인터 조절자

    입력 데이터 레코드에서 입력 버퍼로 값을 읽을 때에 포인터의 위치에 따라 값을 읽는다. INPUT 구문은 포인터의 이동을 관리하기 위하여 3가지 방법을 제공한다.

     

    • 열 포인터 조절자

    데이터 레코드에서 데이터 값을 읽을 때에 포인터의 위치를 재설정한다.

     

    • 행 포인터 조절자

    데이터 레코드에서 데이터 값을 읽을 때에 포인터의 위치를 재설정한다.

     

    • 행고정지정자

    입력 버퍼에서 입력 레코드를 유지하도록 후에 다른 INPUT 구문이 레코드를 처리 있도록 한다. (기본적으로 INPUT 구문은 이전 레코드를 해제하고 다른 레코드를 읽는다.)

     

    열과 포인터 조절자를 사용하여서 포인터를 이동시키기 위하여 절대적인 번호 또는 번호를 지정 있고, 현재 포인터 위치를 기준으로 또는 행의 상대 위치를 지정 있다. 테이블 6.6 INPUT 구문으로 활용 있는 포인터 조절 목록이다.

     

    [ INPUT 구문에서 사용 가능한 포인터 조절자 목록]

    포인터 조절자 상대 절대
    열 포인터 조절자 +n @n
    +numeric-variable @numeric-variable
    +(expression) @(expression)
    @'character-string'
    @character-variable
    @(character-expression)
    행 포인터 조절자 / #n
    #numeric-variable
    #(expression)
    행고정 지정자 @ (해당사항없음)
    @@ (해당사항없음)

     

    참고 : 항상 적용되는 변수 앞에 포인터 조절자를 지정하라.

     

    포인터의 현재 열과 위치를 정의하기 위하여 INFILE 구문에서 COLUMN= LINE=옵션을 사용 있다.

     

    1) 열과 행 포인터 조절자 사용

     

    포인터 조절자는 입력 값이 시작하는 열을 표시한다.

     

    다음 입력 레코드로 이동하거나 관측치를 구성하는 입력 레코드의 개수를 정의하기 위하여 INPUT 구문 내에서 포인터 조절자를 사용하라. 포인터 조절자는 읽을 입력 레코드를 지정한다. 입력 버퍼 내에서 다중 데이터 레코드를 읽기 위하여, INFILE 구문에서 N=옵션을 사용하여 접근하기 위한 레코드의 개수를 지정하라. N=옵션을 생략하기 위해서는 특별한 예방책이 필요하다. 상세한 정보는 개별 관측치가 여러 개의 레코드에 존재하는 경우에 데이터 읽기 참고하라.

     

    2) 행고정 지정자 사용하기

     

    행고정 지정자는 다음 사항 중에 해당하는 경우에 현재 입력 레코드에서 포인터를 유지한다.

    -    하나 이상의 INPUT 구문을 사용하여 데이터 레코드를 읽는다.(후행 @)

    -    하나의 입력 라인이 다수의 관측치 값을 소유한다.(이중 후행 @)

    -    데이터 스텝의 다음 반복 처리 과정에서 해당 레코드를 다시 읽을 필요가 있다. (이중 후행 @)

     

    동일 레코드를 이후의 INPUT 구문이 다시 읽는 것을 허용하기 위하여 단일 후행 @ 사용하라. 데이터 스텝의 반복수행 과정에서 다음 차례의 INPUT 구문이 다시 읽을 있도록 레코드를 유지하기 위하여 이중 후행 @ 사용하라

     

    일반적으로, 데이터 스텝에서 개별 INPUT 구문은 입력 버퍼에 새로운 데이터 레코드를 읽는다. 후행 @ 사용하면 다음 기능을 사용 있다.

     

    • 포인터 위치가 변경되지 않는다.
    • 새로운 레코드를 입력 버퍼로 읽지 않는다.
    • 데이터 스텝의 동일 반복에서 이후의 다음 INPUT 구문이 동일 레코드를 계속 읽도록 한다.

     

    SAS 다음의 경우에 후행 @으로 유지하고 있는 레코드를 해제한다.

     

    • Null INPUT 구문이 실행되는 경우
      INPUT;
    • 후행 @ 이 포함되지 않은 INPUT 구문이 실행되는 경우
    • 데이터 스텝의 다음 반복이 시작하는 경우

     

    일반적으로, 이중 후행 @(@@) 사용하는 경우에 데이터 스텝의 다음 반복에서도 INPUT 구문은 동일 레코드를 계속 읽는다. 다음 경우에 이중 후행 @으로 유지되는 레코드를 바로 해제한다.

     

    • 입력포인터가 레코드의 끝을 경유하여 이동하는 경우
    • Null INPUT 구문이 실행되는 경우
      INPUT;
    • 데이터 스텝에서 단일 후행 @을 포함하는 INPUT 구문이 실행된 이후에 데이터 스텝의 다음 반복이 시작하는 경우
      INPUT @;

     

    3) 데이터 읽은 후 포인터 위치

    값을 읽은 후에 입력 포인터의 위치를 이해하는 것은 아주 중요하다. 특히 단일 INPUT 구문에서 입력 형식을 결합하여 사용하는 경우 중요하다. 형식과 포맷 입력 방식을 사용하는 경우에는 포인터는 INPUT 구문에서 표시된 열을 읽고 다음 열에서 멈춘다. 그러나, 목록 입력을 사용하는 경우에 포인터는 데이터 값을 찾기 위하여 데이터 레코드를 검색하고, 값이 종료되는 곳을 표시하는 공백을 읽는다. 결과 목록 입력으로 값을 읽은 후에 포인터는 이후의 번째 열에서 멈춘다.

     

    예를 들어, 다음 데이터 레코드를 목록, , 포맷 지정 입력 방식으로 읽을 있다.

     

    ----+----1----+----2----+----3
    REGION1    49670
    REGION2    97540
    REGION3    86342

     

    다음은 데이터 레코드를 읽기 위하여 목록 입력 방식을 사용한다.

     

    input region $ jansales

     

    REGION변수의 값을 읽은 후에 포인터는 9번째 열에서 멈춘다.

    ----+----1----+----2----+----3
    REGION1    49670
            ↑

     

    다음 INPUT 구문은 데이터 레코드를 읽기 위하여 입력과 포맷 지정 입력 방식을 사용한다.

    • 열 입력 방식
    input region $ 1-7 jansales 12-16;

     

    • 포맷 지정 입력 방식
    input region $7. +4 jansales 5.;
    
    input region $7. @12 jansales 5.;

     

    REGION변수의 값을 읽기 위하여 INPUT 구문은 7번째 열을 읽도록 지시하고, 8번째 열에서 멈춘다.

    ----+----1----+----2----+----3
    REGION1    49670
           ↑

     


    개별 관측치가 여러 개의 레코드에 존재하는 경우에 데이터 읽기

    INPUT 구문에서 # 포인터 조절자에 지정된 가장 숫자는 입력 버퍼에 읽을 입력 데이터 레코드의 개수를 정의한다. 레코드의 숫자를 변경하기 위하여 INFILE 구문에서 N=옵션을 사용하라. 예를 들어, 다음 문장에서 # 뒤의 가장 값은 3이다.

     

    input @31 age 3. #3 id 3-4 #2 @6 name $20.;

     

    만약 관련된 INFILE 구문에서 N=옵션을 사용하지 않으면, INPUT 구문은 데이터 스텝이 실행 마다 3개의 입력 레코드를 읽는다.

     

    개별 관측치가 다중 입력 레코드에 존재하지만 마지막 레코드의 값을 읽지 않은 경우에 마지막 입력 레코드의 위치를 표시하기 위하여 INPUT 구문에서 #포인터 조절자 또는 N=옵션을 사용해야 한다. 예를 들어, 관측치마다 값이 4개의 레코드에 존재하지만 단지 처음 개의 입력 레코드에서 값을 읽는다면, 다음 INPUT 구문을 사용하라.

     

    input name $ 1-10 #2 age 13-14 #4;

     

    / 포인터 조절자를 사용하여 바로 다음 레코드로 이동하는 경우에 입력 버퍼로 읽을 레코드의 수를 설정하기 위하여 INPUT 구문에서 # 포인터 조절자 또는 INFILE 구문에서 N=옵션을 사용하라. 이전 레코드로 포인터를 이동하기 위하여 # 포인터 조절자를 사용하라. 예를 들어, 다음 문장은 2개의 레코드를 읽기 위하여 INFILE 구문에서 N=옵션을 지정하지 않았으므로 #2 포인터 조절자가 필요하다.

     

    input a / b #1 @52 c #2;

     

    INPUT 구문은 번째 레코드에서 A 변수에 대한 값을 읽는다. 포인터는 B변수에 대한 값을 읽기 위하여 다음 입력 레코드로 이동한다. 후에 포인터는 2번째 레코드에서 번째 레코드의 번째 열로 이동한 후에 C변수에 대한 값을 읽기 위하여 52번째 열로 이동한다. #2 포인터 조절자는 개별 관측치가 2개의 입력 레코드에 위치하고 있다는 것을 표시하기 때문에, 포인터가 다음 관측치의 번째 레코드(전체 3번째 레코드) 이동한다.

     

    관측치 마다 입력 레코드의 개수가 서로 다르면, 관측치마다 최대 레코드의 수를 지정하기 위하여 INFILE 구문에 N=옵션을 사용하라.

     

    1) 라인의 끝을 경유하여 읽기

     

    포인터 조절자(@ 또는 + ) 적용하여서 포인터가 현재 레코드의 끝으로 이동하거나 현재 레코드 끝을 경유하도록 이동한 후에, 현재 끝에서 추가로 나머지 값을 읽으려 시도하면 나머지 값을 읽기 위하여 포인터는 다음 레코드의 번째 열로 이동한다. 그리고, SAS 로그에 다음 메시지를 작성한다.

     

    NOTE: SAS went to a new line when INPUT statement reached past the end of a line.

     

    INFILE 구문에서 포인터를 다음 레코드로 이동시키는 기본 작업 방식(FLOWOVER 옵션) 변경할 있다.

    • 위와 같은 상태에 대하여 에러를 생성하고, 데이터 생성을 중지시키기 위하여 INFILE 구문에서 STOPOVER 옵션을 사용하라
    • 포인터가 레코드의 끝에 도달하는 경우에 나머지 INPUT 구문의 변수를 결측치 값으로 설정하기 위하여 INFILE 구문에서 MISSOVER 옵션을 사용하라.
    • INPUT 구문에서 사용된 마지막 변수가 서로 다른 길이(varying-length)의 데이터를 포함하고 있는 경우에 열 입력 또는 포맷 지정 입력 방식으로 읽기 위하여 INFILE 구문에서 TURNCOVER 옵션을 사용하라. TRUNCOVER 옵션은 해당 필드가 지정된 길이보다 짧은 경우에 입력버퍼에 저장된 내용을 그대로 변수에 할당한다.

     

    2) 레코드 이전(음수)으로 포인터 이동하기

    포인터 조절자가 레코드를 번째 이전(음수 )으로 포인터 위치를 이동시키는 경우에 포인터는 번째 열에 위치한다. 예를 들어, 다음 INPUT 구문은 포인터가 번째 값을 읽은 후에 음수 열로 이동되도록 한다.

     

    data test;
       input a @(a-3) b;
       datalines;
     2
    ;

     

    A변수의 값을 읽은 후에 포인터는 번째 열에 위치하고, 변수 A B 동일한 값을 읽는다.

     


    비유효한 데이터 처리 방법

    변수의 입력 값에 유효하지 않은 문자가 존재하는 경우

     

    • 결측값으로 처리하기 위한 변수의 값 또는 INVALIDDATE=시스템 옵션을 사용하여 결측값을 대체하기 위한 값을 설정하라. INVALIDDATA= 시스템 옵션은 SAS 도움말을 참조하라.
    • SAS 로그에 유효하지 않은 데이터에 대한 내용을 출력한다.
    • SAS로그에 유효하지 않은 값이 포함된 입력 라인과 열 번호를 출력하고, 출력되지 않는 문자는 16진수로 표시된다. 열 번호를 쉽게 확인하도록 입력 라인 위에 열지시자(rule line)가 출력된다.
    • 현재 관측치에 대하여 자동 변수 _ERROR_을 1로 설정한다.

     

    에러 출력에 대한 출력형식 수정자(format modifier) SAS로그에 출력되는 메시지의 양을 제어한다. ? ?? 수정자는 모두 비유효한 데이터 메시지의 출력을 제어한다. 그러나, ?? 수정자는 자동 변수 _ERROR_ 0으로 재설정한다. 예를 들어, 다음 2 문장은 동일하다.

     

    • 문장 1
    input x ?? 10-12;
    • 문장 2
    input x ? 10-12; 
    _error_=0;

     

    양쪽 모두 X변수의 유효하지 않은 값을 결측값으로 설정한다. 유효하지 않은 데이터의 발생하는 원인에 대하여는 SAS Language Reference: Concepts 참고하라.


    파일의 끝(End-Of-File) 표시

    INPUT 구문이 데이터의 끝에 도달하면 파일의 표시를 감지한다. 데이터 스텝이 end-of-file표시에 도착한 이후에 다른 레코드를 읽으려고 시도하면 실행은 중지된다. 데이터 스텝이 계속 실행되도록 하기 위하여는 INFILE 구문에서 END= 또는 EOF 옵션을 사용하라. 그러면, 파일의 (End-of-file) 표시를 감지하도록 하거나, INPUT 구문의 실행을 중지하고 데이터 스텝을 계속 실행하도록 SAS프로그램 문장을 작성 있다. 상세한 내용은 INFILE 구문을 참고하라.

     


    배열(Arrays)

    INPUT 구문은 입력 데이터를 읽기 위하여 배열 참조를 사용 있다. 배열 참조를 괄호 안에 배치하여 포인터 조절자에서 배열 참조를 사용 있다. “예제6. 문자형 변수를 사용하여 포인터 위치 정하기 참조하라.

     

    이전에 정의된 명시적 배열의 모든 원소를 입력 하기 위하여 배열 첨자 별표(*) 사용하라. 중괄호, 대괄호 또는 괄호 안에 첨자를 작성하라. 다음은 문장 형태를 보여준다.

     

    INPUT array-name{*};

     

    목록, , 포맷 지정 입력 방식과 배열을 함께 사용 있다. 그러나, 임시배열(_TEMPORARY_) 정의된 배열에는 값을 입력 없고, 대신에 별표 첨자를 사용하라. 예를 들어, 다음 문장은 X1~X100변수를 생성하고, 입력형식 2. 사용하여 변수에 데이터 값을 할당한다.

    array x{100};
    
    input x{*} 2.;

    6. 비교 사항

    • INPUT 구문은 외부 파일의 원시 데이터 또는 SAS에서 입력되는 (DATALINES 구문 뒤에 존재하는 데이터) 내부 데이터 라인을 읽는다. SET 구문은 데이터 값에 대한 요약정보를 포함하고 있는 SAS 데이터 세트를 읽는
    • INPUT 구문은 데이터를 읽고, PUT 구문은 SAS 로그 또는 외부 파일 등에 데이터 값 또는 텍스트 문자열 또는 양쪽 모두를 작성한다.
    • INPUT 구문은 외부파일에서 데이터를 읽을 수 있다. INFILE 구문에서 외부파일 지정하고 파일 읽는 방식에 대한 옵션을 지정한다.

     


    7. 관련 구문

    함수명 함수내용
    ARRAY 구문 배열에서 사용하기 위한 배열 원소를 정의한다. 
    ATTRIB 구문 ATTRIB 구문을 사용하여 여러 변수에 대한 출력 형식(format), 입력 형식(informat), 라벨(Label), 길이(Length) 등을 한 번에 처리할 수 있다.
    FORMAT 구문 변수에 영구적으로 출력 형식(format)을 지정하여서 SAS 데이터 세트의 기술정보 (Descriptor information)를 수정한다.
    INFORMAT 구문 변수에 영구적으로 입력 형식(Informat)을 지정한다. 
    INPUT 구문 입력 데이터 레코드에서 관측치 값을 변수로 읽으려는 방법을 정의하고, 입력값을 해당 SAS 변수에 할당한다. 외부 파일 또는 내부 데이터에서 원시 데이터를 읽기 위하여 INPUT 구문을 사용한다. 
    INPUT 구문, 열입력 방식 지정된 열에서 입력 값을 읽어서 대응되는 SAS 변수에 값을 할당한다.
    INPUT 구문, 입력형식 지정 입력 방식 지정된 입력 형식(Informat)으로 입력값을 읽어서 해당하는 SAS 변수에 할당한다.
    INPUT 구문(목록 입력방식) 입력 데이터를 검색하여서 해당하는 SAS 변수에 할당한다.
    INPUT 구문, 변수 이름 지정 입력 방식 “변수이름 = “ 뒤에 존재하는 데이터 값을 읽어서 해당 SAS 변수에 할당한다.
    LABEL 구문 변수에 대한 설명 레이블을 지정한다.
    LENGTH 구문 변수를 저장하기 위하여 사용되는 변수의 길이(byte의 수)를 지정한다. 

    [SAS Statement] SAS 데이터 스텝 구문 사전 목록]

     


    8. 예 제

    예제1 : 단일 INPUT 구문에서 다수의 입력 형식 사용

    다음 예제는 단일 INPUT 구문에서 여러 입력 형식을 사용한다.

    SAS Statements
    data club1;
       input Idno Name $18.
             Team $ 25-30 Startwght Endwght;
       datalines;
    023 David Shaw         red    189 165
    049 Amelia Serrano     yellow 189 165
    ... more data lines ...
    ;

     

    변수 입력 형식
    Idno, Startwght, Endwght 목록 입력 방식
    Name 포맷 지정 입력 방식
    Team 입력 방식

     


    예제2 : Null INPUT 구문 사용하기

    다음 예제는 인수가 없는 INPUT 구문을 사용한다. 데이터 스텝은 SAS 변수를 생성하지 않고 레코드를 입력 파일에서 출력 파일로 복사한다.

    SAS Statements
    data _null_;
       infile file-specification-1;
       file file-specification-2;
       input;
       put _infile_;
    run;

     


    예제3 : 입력 버퍼에서 레코드 유지하기

    다음 예제는 가지 유형으로 구성된 입력 데이터 레코드를 포함하고 있는 파일을 읽어서 SAS 데이터 세트를 생성한다. 번째 데이터 레코드의 유형은 특별 대학 코스(C) 대한 정보를 포함하고, 번째 레코드 유형은 코스에 등록한 학생(S) 관한 정보를 포함하고 있다. 2 유형으로 구성된 레코드를 읽어서, 다른 출력형식을 사용하는 서로 상이한 변수에 값을 할당하기 위하여 2개의 INPUT 구문이 사용된다. 수업 정보를 포함한 레코드는 번째 열에 C 값으로 위치하고, 학생 정보를 포함한 레코드는 번째 열에 S 값으로 위치한다.

    Results
    ----+----1----+----2----+
    C HIST101 Watson
    S Williams 0459
    S Flores   5423
    C MATH202 Sen
    S Lee      7085

     

    개별 레코드에 수업 또는 학생 정보를 포함하고 있는지 여부를 판단하기 위한 변수를 먼저 읽기 위하여 번째 INPUT 구문을 사용한다.

    SAS Statements
    data schedule(drop=type);
       infile file-specification;  
       retain Course Professor;
       input type $1. @;
       if type='C' then
          input course $ professor $;
       else if type='S' then
          do;
            input Name $10. Id;
            output schedule;
          end;
    run;
    proc print;
    run;

     

    번째 INPUT 구문은 모든 라인의 번째 열에서 TYPE변수의 값을 읽는다. 번째 INPUT 구문이 후행 @으로 종료되었기 때문에, 데이터 스텝에서 다음 단계의 INPUT 구문은 동일 라인을 계속해서 읽는다. 이후의 IF-THEN 구문은 다른 INPUT 구문이 나머지 라인을 읽기 전에 레코드가 수업 정보 인지 학생 정보인지 여부를 확인한다. 후행 @ 없는 INPUT 구문은 라인의 유지 상태를 해제하며, RETAIN 구문은 특별 대학 코스에 대한 정보를 유지한다. 데이터 스텝은 학생 정보 레코드를 읽은 후에 SCHEDULE 데이터 세트에 관측치를 작성한다. 다음 PROC PRINT 출력물은 데이터 세트 SCHEDULE 결과를 보여준다

     

      [PROC PRINT 결과물 – Schedule 데이터 세트]

    Results
    The SAS System                        1
     
            OBS    Course     Professor    Name         Id
             1     HIST101     Watson      Williams     459
             2     HIST101     Watson      Flores      5423
             3     MATH202     Sen         Lee         7085

     


    예제4 : 데이터 스텝의 반복수행 과정에서 현재 레코드 유지하기

    다음 예제는 개별 입력 데이터 레코드를 읽어서 다중 관측치를 생성하는 방법을 보여준다. 개별 레코드에는 다수의 NAME AGA 변수 값을 소유하고 있다. 데이터 스텝은 NAME 값과 AGE값을 읽어서 관측치를 출력하고, 반복적으로 다른 NAME AGE 세트를 읽고 다시 출력하는 작업을 레코드에서 모든 입력 값을 처리 때까지 계속 반복한다.

    SAS Statements
    data test;
       input name $ age @@;
       datalines;
    John 13 Monica 12 Sue 15 Stephen 10
    Marc 22 Lily 17
    ;

     

    INPUT 구문은 데이터 스텝의 반복수행 과정에서 입력 포인터를 관리하기 위하여 이중 후행 @ 사용한다.

     


    예제5 : 수치형 변수를 사용하여 포인터 위치 정하기

    다음 변수는 포인터의 위치를 지정하기 위하여 수치형 변수를 사용한다. 원시 데이터 파일은 다국적 기업의 여러 사무소의 고용 수치를 포함하고 있다. 입력 데이터 레코드는 다음과 같다.

    Results
    ----+----1----+----2----+----3----+
    8      New York    1 USA 14
    5   Cary           1 USA 2274
    3 Chicago          1 USA 37
    22 Tokyo           5 ASIA 80
    5   Vancouver      2 CANADA 6
    9       Milano     4 EUROPE 123

     

    번째 열은 레코드에서 사무소가 위치하는 도시에 대한 정보가 시작하는 열에 대한 위치를 포함하고 있다. 다음 숫자 열은 지역 범주에 대한 정보이고, 지리적 영역에 대한 정보는 사무소 직원의 앞에 위치한다.

     

    후행 @ @numeric-variable 포인터 조절자를 함께 사용하여 사무소 위치의 정보를 읽는다.

    2개의 INPUT 구문을 사용하여 레코드를 읽는다. 번째 INPUT 구문에서 @numeric-variable 포인터 조절자에서 사용하기 위한 값을 읽은 후에, 번째 INPUT 구문에서 포인터가 이동하기 위한 열을 정의하기 위하여 값을 사용한다.

    SAS Statements
    data office (drop=x);
       infile file-specification;
       input x @;
       if 1<=x<=10 then
          input @x City $9.;
       else do;
          put 'Invalid input at line ' _n_;
          delete;
       end;
    run;

     

    데이터 스텝은 OFFICE 데이터 세트에 단지 5개의 관측치를 작성한다. 4번째 입력 데이터 레코드 X 값이 10보다 크기 때문에 데이터 세트에 작성되지 않는다. 그러므로, 번째 INPUT 구문이 실행되지 않는다. 대신에 PUT 구문은 SAS로그에 메시지를 작성하고 DELETE 구문은 관측치 처리를 중지한다.

     


    예제6 : 문자형 변수를 사용하여 포인터 위치 정하기

    다음 예제는 포인터의 위치를 배치하기 위하여 문자형 변수를 사용한다. 위의 예제에서 생성된 OFFICE 데이터 세트에는 사무소 위치가 존재하는 곳의 도시를 표시하는 문자형 변수 CITY 존재한다. 원시 데이터 파일에서 추가적으로 값을 읽을 필요가 있다고 가정하자. 데이터 스텝을 추가로 작성하여, 후행 @ 해당 값을 검색하기 위한 @character-expression 포인터 조절자를 @character-variable 포인터 조절자와 함께 사용한다.

     

    OFFICE데이터 세트에서 관측치가 원래의 입력 데이터 레코드 순서로 존재하면, 다음 데이터 스텝을 사용 있다.

    SAS Statements
    data office2;
       set office;
       infile file-specification;
       array region {5} $ _temporary_
             ('USA' 'CANADA' 'SA' 'EUROPE' 'ASIA');
       input @city Location : 2. @;
       input @(trim(region{location})) Population : 4.;
    run;

     

    ARRAY 구문은 임시 배열 원소에 초기값을 할당한다. 배열 원소는 사무소 위치의 지리적 영역에 대응된다. 번째 INPUT 구문은 @character-variable 조절자를 사용한다. Office 데이터 세트의 CITY변수의 값을 사용하여 개별 레코드를 검색한다. CITY변수의 값으로 검색된 문자 다음의 비공백 열에서 LOCATION 값을 읽는다. LOCATION변수는 사무소의 지리적 영역에 대한 숫자 범주를 표시한다. 번째 INPUT 구문은 입력 레코드에서 Population변수를 정의하기 위하여 @character-expression 포인터 조절자에서 배열참조를 사용한다. 표현식은 문자 값에서 후행 공백을 제거하기 위하여 TRIM함수를 사용한다. 방법은 입력 데이터의 문자열과 배열 원소의 사이에 완전하게 일치하는 값을 찾는다.  아래는 PROC PRINT 사용하여 OFFICE2 데이터 세트의 결과값을 출력한 결과이다.

     

    [PROC PRINT 결과물 – Office2 데이터 세트]

    Results
    The SAS System                        1
     
               OBS    City         Location    Population
                1     New York         1            14  
                2     Cary             1          2274  
                3     Chicago          1            37  
                4     Vancouver        2             6  
                5     Milano           4           123

     


    예제7 : 포인터를 뒤(왼쪽)로 이동하기

    다음 예제는 포인터를 뒤로 이동시키기 위한 가지 방법을 보여준다.

     

    • INPUT 구문은 26열에서 시작하는 BOOK 변수의 값을 읽기 위하여 @포인터 조절자를 사용한다. 포인터는 COMPANY변수의 값을 읽기 위하여 동일 라인에서 왼쪽 방향으로 이동하여 첫 번째 열에 위치한다.
    SAS Statements
    input @26 book $ @1 company;

     

    • 다음 INPUT 구문은 포인터를 왼쪽으로 1열만큼 이동하기 위하여 +numeric-variable 또는 +(expression) 을 사용한다. 다음 2개의 문장은 동일하다.

     - 문장 1

    SAS Statements
    m=-1;
    
    input x 1-10 +m y 2.;

     - 문장 2

    SAS Statements
     input x 1-10 +(-1) y 2.;

     


     


    [SAS Statement] SAS 데이터 스텝 구문 사전 목록]

     

    SAS 함수(SAS Function) 리스트 링크
    반응형

    댓글