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

【SAS Statement】 INPUT 구문, 목록(List) 입력방식

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

포스팅 목차

    o INPUT 구문, 목록(List) 입력방식

     


    1. 목 적

       INPUT 구문, 목록(List) 입력방식은 입력 데이터를 검색하여서 해당하는 SAS 변수에 할당한다.

     


    2. 문 법

    INPUT <pointer-control> variable <$><&> <@ | @@>;

    INPUT <pointer-control>variable <:|&|~> <informat.> <@ | @@>;

     


    3. 구문 설명

    1) Pointer-control

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

     

    참고 : INPUT 구문에서 포인터 조절자 포인터 조절자
    주요기능 : 예제2 : 데이터 중간에 공백을 포함하는 문자형 데이터 읽기

     

    2) Variable

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

    3) $

       변수를 문자 변수로 저장되도록 지정한다. 변수가 이전에 문자로 저장되었으면 $ 기호는 필요하지 않는다.

     

    Tip : 변수가 이전에 문자로 저장되었으면 $ 기호는 필요하지 않는다.
    주요기능 : 예제1 : 단순 목록 입력 방식을 사용하여 정렬되지 않은 데이터를 읽기

     

    4) &

       문자값 중간에 하나 이상의 공백을 포함하는 경우에 지정한다. 이 포맷(format) 수정자를 지정하면 포인터가 문자값 중간에 포함된 공백 다음에

    • 2개의 연속된 공백
    • 정의된 변수 길이
    • 입력 라인의 끝

       위 항목 중에서 가장 먼저 도달할 때까지 값을 읽는다. & 수정자는 해당 변수 이름과 $ 부호 다음에 작성해야 한다.

     

    제한사항 : & 수정자는 영향을 미치는 변수 이름과 $ 부호 다음에 작성해야 한다.
    Tip : & 수정자 뒤에 입력형식(informat) 지정하면, format 수정자는 2개의 공백을 만나야 종료한다.
    참고 : 수정된 목록 입력 방식
    주요기능 : 예제2 : 데이터 중간에 공백을 포함하는 문자형 데이터 읽기

     

    5)  :

       INPUT 구문이 변수의 값을 읽기 위하여 사용하는 입력 형식(informat)을 지정한다. 문자형 변수에 대하여, 이 포맷 수정자는 이후의 공백이 아닌 열에서 시작하여서 포인터가

    • 다음에 존재하는 공백 열
    • 변수의 정의된 길이
    • 데이터 라인의 끝

       위 항목 중에서 가장 먼저 도달할 때까지 값을 읽는다. (관측값 중간에 공백을 포함하는 경우 사용할 수 없다. )

    수치형 변수에 대하여, 이 포맷 수정자는 이후의 공백이 아닌 열에서 시작하여서

    • 다음에 존재하는 공백 열
    • 데이터 라인의 끝

       위 항목 중에서 포인터가 먼저 도달 할 때까지 값을 읽는다. 그러나 해당 필드가 포맷의 길이보다 길면, 지정한 변수의 길이 이후의 값은 잘린다.

     

    Tip : 변수의 길이가 이전에 정의되지 않았으면, 변수의 값을 읽어서 입력형식(informat) 길이로 값을 저장한다.
    Tip : 포인터는 다음 공백 열을 만날 때까지 계속 읽는다. 그러나, 필드가 포맷의 길이보다 길면, 변수의 길이 이후의 값은 잘린다.
    참고 : 수정된 목록 입력 방식
    주요기능 : 예제3 : 입력형식을 사용하여 정렬되지 않은 데이터 읽기
    예제5: 수정된 목록 입력 방식을 사용하여 구분자로 구분된 데이터 읽기

     

    6)  ~

       문자값 내에서 단일 인용부호, 이중 인용부호, 구분자를 특수한 방식으로 취급하도록 지시하는 포맷 수정자로 인용 부호 안에 포함된 구분자를 구분자 대신 일반적인 문자로 처리하고, 변수에 값이 작성되는 경우에 인용부호를 유지한 상태로 할당한다. INFILE 구문에서 DSD옵션을 함께 사용해야 한다.(수정된 목록 입력 방식)

     

    제한사항 : INFILE 구문에서 DSD옵션을 함께 사용해야 한다. 그렇지 않으면, INPUT 구문은 옵션을 무시한다.
    참고 : 수정된 목록 입력 방식
    주요기능 : 예제5: 수정된 목록 입력 방식을 사용하여 구분자로 구분된 데이터 읽기

     

    7) Informat.

       변수의 값을 읽기 위하여 사용되는 입력 형식(informat)을 지정한다.

     

    Tip : 실제 입력 값에 포함되어 있는 소수 부분의 값은 수치형 입력형식(informat)에서 소수 부분의 지정자를 무시한다.
    주요기능 : 예제3 : 입력형식을 사용하여 정렬되지 않은 데이터 읽기
    예제5: 수정된 목록 입력 방식을 사용하여 구분자로 구분된 데이터 읽기

     

    8) @

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

     

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

     

    9) @@

       데이터 스텝의 반복수행과정 중에서 다음 반복 과정의 INPUT 구문 실행을 할 때까지 현재 입력 레코드를 유지한다. 이 행 고정 지정자(line-hold specifier)를 이중 후행@라고 한다. 이중 후행 @는 개별 입력 라인이 여러 개의 관측치 값을 소유하고 있는 경우에 유용하다.

     

    제한사항 : 이중 후행 @ INPUT 구문에서 마지막 항목으로 작성해야 한다.
    Tip : 이중 후행 @ 개별 입력 라인이 여러 개의 관측치 값을 소유하고 있는 경우에 유용하다.
    참고 : INPUT 구문에서 행고정 지정자 사용하기

    4. 범 주

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

     

    5. 상세 설명

    목록 입력 방식 사용 시기

    목록 입력 방식을 사용하기 위하여 입력 데이터 레코드에 필드가 나열된 순서로 INPUT 구문에서 변수를 나열해야 한다. 다음 값을 찾기 위하여 데이터 라인을 검색하지만 공백을 포함 없다. 목록 입력 방식에서는 데이터가 지정한 열에 위치 필요는 없다.

     

    그러나, 만약 사이의 구분자를 변경하지 않았으면 변수들은 적어도 하나 이상의 공백으로 구분된다. 기본적으로 데이터 값에 대한 구분자는 하나의 공백 또는 입력 레코드의 끝으로 구분된다. 목록 입력 방식은 다음 값을 읽기 위하여 데이터 값을 건너뛰어서 읽을 없지만, 데이터 레코드에서 주어진 지점 이후의 모든 값을 무시 있다. 그러나, 포인터 조절자를 사용하여 데이터 값의 읽는 순서를 변경 있다.

     

    목록 입력에는 다음 가지 유형이 있다.

    • 단순 목록 입력
    • 수정된 목록 입력

     

    단순 목록 입력 방식의 일부 제약을 극복하기 위하여 format 수정자(modifier) 사용하는 수정된 목록 입력 방식(& , : , ~) 으로 INPUT 구문을 융통성 있게 사용 있다.

     


    단순 목록 입력

    단순 목록 입력은 INPUT 구문에서 읽을 있는 데이터 유형에 대한 일부 제한이 있다.

     

    • 기본적으로, 하나 이상의 공백으로 입력 값을 분리해야 한다. 공백 이외의 다른 구분자를 지정하기 위하여 INFILE 구문에서 DLM=, DLMSTR=옵션 또는 DSD옵션을 사용하라.
    • 마침표(문자/숫자 모두) 또는 2개의 인접한 구분자를 사용하여 결측치 값을 나타낸다. (관측값은 공백을 포함 할 수 없음)
    • 변수가 이전에 LENGTH, ATTRIB, INFORMAT 구문에서 길이를 더 길게 지정되지 않았으면 문자 입력값은 8바이트보다 더 길 수 없다.
    • 구분자를 변경하지 않았으면 문자값은 공백을 포함 할 수 없다.          
    • 데이터는 표준 수치형 또는 문자형 형식(format)으로 존재해야 한다.

     


    수정된 목록 입력 방식

    목록 입력 방식은 Format 수정자를 사용하는 경우에 효율적으로 값을 읽을 있다.

     

    포맷 수정자 사용목적
    & 중간에 공백을 포함하는 문자값을 읽는다.
    : 열을 기준으로 정렬되지 않고, 입력형식(informats)이 제공하는 추가적인 지시사항이 필요한 데이터 값을 읽는다. (관측값 중간에 공백을 포함 할 수 없다.) **
    ~ 인용 문자 값 안에 포함된 구분자를 문자로 처리하고, 인용 부호를 그대로 유지한다. XE "~:INPUT 구문, 목록 입력방식"
    ** 열을 기준으로 정렬된 문자값을 빠르게 읽기 위하여 포맷 지정 입력 방식과 포인터 조절자를 사용하라.

     

    예를 들어 8바이트보다 문자 또는 비표준화 값을 포함하는 수치형 값을 읽기 위하여 : 수정자와 입력형식(Informat) 함께 사용하라.

     

    목록 입력 방식은 공백을 구분자로 사용하기 때문에, 공백을 포함하는 값을 읽기 위하여 수정된 목록 입력 방식을 사용하라.

    & 수정자는 관측값 중간에 단일 공백을 포함하는 문자값을 읽는다. 그러나, 문자값은 이상의 공백으로 구분되어야 한다.

     

    목록 입력 방식을 사용하여 / 공백 또는 내부에 공백을 포함하는 값을 읽기 위하여, INFILE 구문에서 DLM= 또는 DLMSTR= 옵션을 사용하여 구분자를 다른 문자값으로 지정하라.

     

    입력데이터가 공백을 구분자로 사용하고 데이터 / 공백 또는 내부에 공백을 포함하고 있으면, 입력 또는 포맷 지정 입력 방식의 사용이 필요 있다. 인용부호가 구분자가 포함된 데이터 값을 둘러싸고 있으면, INFILE 구문에서 목록 입력방식과 DSD옵션을 함께 사용하라.

     


    6. 비교 사항

    수정된 목록 입력과 포맷 지정 입력 방식의 차이

    수정된 목록 입력 방식 열을 기준으로 정렬되지 않은 데이터를 읽기 위하여 입력형식(Informat) 사용 있는 검색 기능을 포함하고 있다. 포맷 지정 입력 방식은 입력 방식이 변수값을 읽는 방식과 유사하게 포인터를 이동시킨다. 포인터는 입력형식에서 지정된 열로 이동한 후에 다음 열에 멈춘다.

     

    다음 데이터 스텝은 번째 데이터 값을 읽기 위하여 수정된 목록 입력 방식을 사용하고, 번째 값은 포맷 지정 입력 방식을 사용하여 읽는다.

     

    data jansales;
       input item : $10. amount comma5.;
    datalines;
    trucks 1,382
    vans 1,235
    sedans 2,391
    ;

     

    수정된 목록 입력 방식으로 ITEM 변수의 값을 읽는다. INPUT 구문은 포인터가 공백을 발견하는 경우에 읽는 것을 중지한다. 포인터는 필드의 끝을 기준으로 오른쪽으로 번째 열로 이동한다. 그곳은 포인터가 포맷 지정 입력 방식으로 AMOUNT 변수의 값을 읽기 시작하는 곳이다. (INPUT 구문의 데이터 읽은 포인터 위치 참조)

     

    한편 포맷 지정 입력 방식은 나머지 필드를 계속 읽는다. 다음 INPUT 구문은 양쪽 데이터 값을 포맷 지정 입력 방식을 사용하여 읽는다.

    input item $10. +1 amount comma5.;

     

    위의 포맷 지정 입력 방식으로 데이터를 올바르게 읽기 위하여 다음과 같이 번째 데이터 값은 모두 10번째 이후(아래에서는 12번째 존재) 존재해야 한다.

     

    ----+----1----+----2
    trucks     1,382
    vans       1,235
    sedans     2,391

     

    또한 포맷 지정 입력 방식으로 ITEM 변수의 값이 읽은 이후에 포인터를 AMOUNT 변수의 값이 시작하는 열로 이동시키기 위하여 포인터 조절자 +1 지정해야 한다.

     

    데이터가 인용 부호를 포함하는 경우

    INFILE 구문에서 콤마를 구분자로 설정하기 위하여 DSD옵션을 사용하면, INPUT 구문은 변수에 값이 작성되기 전에 인용부호를 제거한다. INPUT 구문에서 인용부호를 데이터 값의 일부로 유지하기 위하여 INFILE 구문에서 tilde(~) 수정자를 사용하라.

     


    7. 관련 구문

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

     


    8. 예 제

    예제1 : 단순 목록 입력 방식을 사용하여 정렬되지 않은 데이터를 읽기

    다음 데이터 스텝에서 INPUT 구문은 단순 목록 입력 방식을 사용하여 입력 데이터 레코드를 읽는다.

     

    SAS Statements
    data scores;
       input name $ score1 score2 score3 team $;
       datalines;
    Joe 11 32 76 red
    Mitchel 13 29 82 blue
    Susan 14 27 74 green
    ;

     

    다음 INPUT 구문은 위의 데이터 라인에서 분석에 필요한 처음 4개의 변수를 읽는다. 향후 데이터 처리에서 필요하지 않는 TEAM변수를 읽지 않는다.

     

    input name $ score1 score2 score3;

     


    예제2 : 데이터 중간에 공백을 포함하는 문자형 데이터 읽기 

    다음 데이터 스텝에서 INPUT 구문은 데이터 중간에 공백을 포함하고 있는 문자값을 읽기 위하여 &포맷 수정자(format modifier) 목록 입력 방식을 함께 사용한다.

     

    SAS Statements
    data list;
       infile file-specification;
       input name $ & score;
    run;

     

    다음 입력 데이터 레코드를 읽을 있다.

     

     [입력 데이터 레코드]

    Results
    ----+----1----+----2----+----3----+
    Joseph   11 Joergensen  red
    Mitchel  13 Mc Allister  blue
    Su Ellen  14 Fischer-Simon  green

     

    &수정자는 INPUT 구문에서 영향을 미치는 변수 뒤에 위치한다. 포맷 수정자가 NAME변수 뒤에 위치하기 때문에 입력 데이터 레코드에서 적어도 2 이상의 공백으로 NAME 필드와 SCORE 필드가 구분되어야 한다.

     

    다음과 같이 포맷 수정자와 입력형식을 함께 지정 있다.

     

    SAS Statements
    input name $ & +3 lastname & $15. team $;

     

    추가적으로 위의 INPUT 구문 역시 첫번째 예제와 동일하게 필요한 데이터만 읽는다. +3 포인터 조절자는 LASTNAME TEAM변수의 값을 읽기 위하여 SCORE변수 값을 건너뛰도록 포인터를 이동시킨다.

     

    예제3 : 입력형식을 사용하여 정렬되지 않은 데이터 읽기

    다음 데이터 스텝은 지정된 입력형식으로 데이터 값을 읽기 위하여 수정된 목록 입력 방식을 사용한다. $10. 입력형식은 최대 10 문자까지 문자변수의 값을 읽도록 한다.

     

    SAS Statements
    data jansales;
       input item : $10. amount;
       datalines;
    trucks 1382
    vans 1235
    sedans 2391
    ;

     


    예제4 : 목록 입력 방식과 입력 형식을 사용하여 콤마로 구분된 데이터 읽기

    다음 데이터 스텝은 공백 대신 콤마로 구분된 목록 입력 값을 읽기 위하여 INFINE 구문에서 DELIMITER=옵션을 사용한다. 다음 예제는 데이터를 읽기 위하여 입력형식을 사용하고, 데이터를 작성하기 위하여 출력형식을 사용한다.

     

    SAS Statements
    options pageno=1 nodate ls=80 ps=64;
    data scores2;
       length Team $ 14;
       infile datalines delimiter=',';
       input Name $ Score1-Score3 Team $ Final_Date:MMDDYY10.;
       format final_date weekdate17.;
       datalines;
    Joe,11,32,76,Red Racers,2/3/2007
    Mitchell,13,29,82,Blue Bunnies,4/5/2007
    Susan,14,27,74,Green Gazelles,11/13/2007
    ;
     
    proc print data=scores2;
       var Name Team Score1-Score3 Final_Date;
       title 'Soccer Player Scores';
    run;

     

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

    Results
    Soccer Player Scores                             1
    
    
     Obs   Name            Team        Score1   Score2   Score3          Final_Date
      1    Joe        Red Racers         11       32       76      Mon, Feb 3, 2007
      2    Mitchell   Blue Bunnies       13       29       82      Sat, Apr 5, 2007
      3    Susan      Green Gazelles     14       27       74     Thu, Nov 13, 2007

     


    예제5 : 수정된 목록 입력 방식을 사용하여 구분자로 구분된 데이터 읽기

    다음 데이터 스텝은 문자형 데이터에서 인용부호를 유지하고, 인용부호 안에 존재하는 쉼표를 구분자가 아닌 문자로 읽기 위하여 INFILE 구문에 DSD옵션, INPUT 구문에 tilde(물결, ~) 포맷 수정자를 지정하라.

     

    SAS Statements
    data scores;
       infile datalines dsd;
       input Name : $9. Score1-Score3
             Team ~ $25. Div $;
       datalines;
    Joseph,11,32,76,"Red Racers, Washington",AAA
    Mitchel,13,29,82,"Blue Bunnies, Richmond",AAA
    Sue Ellen,14,27,74,"Green Gazelles, Atlanta",AA
    ;

     

    PROC PIRNT SCORE 결과 데이터 세트를 보여준다. TEAM 변수의 값은 인용 부호와 쉼표를 포함하고 있다.

     

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

    Results
    The SAS System                        1
     
    OBS Name      Score1 Score2 Score3           Team            Div
     
     1  Joseph      11     32     76   "Red Racers, Washington"  AAA
     2  Mitchel     13     29     82   "Blue Bunnies, Richmond"  AAA
     3  Sue Ellen   14     27     74   "Green Gazelles, Atlanta" AA

     


     


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

     

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

    댓글