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

【SAS Statement】 PUT 구문

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

포스팅 목차

    o PUT 구문

     


    1. 목 적

       PUT 구문은 가장 최근 FILE 구문에서 지정한 SAS 로그, SAS 출력 윈도우, 또는 외부 파일 등에 출력 라인을 작성한다.

    데이터 스텝의 현재 반복에서 PUT 구문 전에 FILE 구문을 지정하지 않으면, 기본적으로 SAS 로그에 출력 라인을 작성한다. FILE 구문에서 PRINT 옵션을 지정하면, SAS 출력 윈도우에 출력 라인을 작성한다.

       PUT 구문은 변수의 데이터 값, 문자열, 16진수 문자 상수를 포함하는 출력 라인을 작성할 수 있으며, PUT 구문의 specifications에 작성할 대상, 위치, 출력 형식 방법 등을 지정한다.

     


    2. 문 법


    PUT
    <specification(s)><_ODS_><@|@@>;


     

    1) 인수 사용하지 않음

       인수 없이 사용되는 PUT 구문은 Null PUT 구문이라고 한다. Null PUT 구문은

     

    • 현재 출력 포인터 위치에 현재 출력 라인을 작성한다. 비록 현재 출력 라인이 공백인 경우에도 작성한다.
    • 프로그램 앞에서 지정된 PUT 구문의 후행 @(trailing @)에 의하여 유지되고 있는 출력라인을 해제한다.

     


    2) 지정자 : specification(s)

       작성되는 내용, 작성 방법, 작성 위치 등을 지정한다. specification은 다음 내용을 포함할 수 있다.

     

       (1) variable

         작성하기 원하는 값을 포함하고 있는 변수를 지정한다.

     

    참고 : 버젼 7이후에 PUT 구문에서 ODS(Output Delivery System) 변수를 지정 있다. 기능에 대하여는 _ODS_ 옵션에 간략하게 설명되어있다. 상세 내용에 대하여는 SAS Output Delivery System: User's Guide 에서 “PUT Statement for ODS” 참조하라.

     

       (2) (variable-list)

         작성하기 원하는 값을 포함하고 있는 변수 리스트를 지정한다. 출력형식 리스트(format-list)는 변수 리스트(variable-list) 바로 뒤에 작성해야 한다.

     

    필요사항 : 출력형식 리스트(format-list) 변수 리스트(variable-list) 바로 뒤에 작성해야 한다.
    참고 : PUT 구문, 출력형식 지정 출력방식

     

       (3) 'character-string'

         작성하기 원하는 텍스트 문자열을 인용부호 안에 작성한다.

     

    Tip : EBCDIC 또는 ASCII 파일에서 16진수 문자열을 작성하기 위하여 후행 인용부호 뒤에 x 붙여서 작성하라.
    Tip : 단일 인용부호 또는 이중 인용 부호를 텍스트 문자열에서 (사이에 공백 없이) 연속적으로 함께 작성하면, 단일 인용부호 또는 이중 인용부호를 단독으로 출력한다.
    관련사항 : 목록 출력 방식(List Output)
    예제 : 다음 문장은 16진수 문자열을 ASCII문자로 전환하면서 HELLO 문자를 작성한다.
    put '68656C6C6F'x;

     

       (4) n*

         바로 다음에 지정된 문자열을 n번 반복하여 출력하도록 지정한다.

    예제 : 다음 문장은 132개의 밑줄을 작성한다.

    put 132*'_';
    주요기능 : 예제4 : 텍스트에 밑줄 긋기

     

       (5) pointer-control

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

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

     

       (6) column-specifications

         값을 작성하기 위한 출력 라인의 열 위치를 지정한다.

    참고 : 출력 방식(Column Output)
    주요기능 : 예제2 : 페이지 안에 포인터를 이동하기

     

       (7) format.

         변수의 값을 작성하면서 사용하기 위한 출력형식(format)을 지정한다.

    참고 : 출력형식 지정 출력 방식(Formatted Output)
    주요기능 : 예제1 : 단일 PUT 구문에서 여러 출력 방식 함께 사용하기

     

       (8) (format-list)

         선행 변수 리스트의 값을 작성하면서 사용하기 위한 출력 형식의 리스트를 지정한다. 출력 형식 리스트(format-list)는 변수 리스트 (variable-list) 바로 뒤에 작성해야 한다.

    제한사항 : 출력형식 리스트(format-list) 변수 리스트 (variable-list) 바로 뒤에 작성해야 한다.
    참고 : PUT 구문, 출력형식 지정 출력방식

     

       (9) _INFILE_

         현재 입력파일 또는 DATELINES 구문 뒤의 데이터 라인에서 마지막으로 읽은 입력 데이터 레코드를 작성하도록 한다. _INFILE_은 현재 INPUT 버퍼를 참조하는 자동 변수이다. 다른 SAS 문장에서는 유사하게 _INFILE_ 자동 변수를 사용할 수 있다.

    Tip : _INFILE_ 현재 INPUT버퍼를 참조하는 자동변수이다. 다른 SAS문장에서 _INFILE_ 자동변수를 사용 있다.
    Tip : 가장 최근에 사용된 INPUT 구문이 다중 입력 데이터 레코드를 읽기 위하여 라인 포인터 조절자를 사용하여도 PUT _INFILE_ 단지 입력 포인터가 현재 위치하고 있는 레코드를 작성한다.
    예제 : 다음 PUT 구문은 번째 입력 데이터 레코드의 전체 값을 작성한다.

    input #3 score #1 name $ 6-23;
    put _infile_;
    주요기능 : 예제6 : 로그에 현재 입력 레코드 작성하기

     

       (10) _ALL_

         변수 이름 지정 출력 방식(named output)을 사용하여 현재 데이터 스텝에서 정의된 모든 변수(자동변수포함)의 값을 작성한다.

    참고 : PUT 구문, 변수이름 지정 출력 방식

     


    3) _ODS_

       모든 열의 데이터값을 (FILE 구문에서 ODS 옵션에 의하여 정의된 것을 참조하여) 특별한 버퍼로 이동하고, 그곳에서 최종적으로 데이터 구성요소(데이터와 테이블에 대한 정의)에 작성한다. FILE 구문의 ODS 옵션은 데이터 스텝의 결과가 작성되는 데이터 구성요소의 구조를 정의한다.

     

    제한사항 : FILE 구문에서 ODS옵션을 사전에 정의한 경우에 _ODS_ 옵션을 사용하라.
    Tip : _ODS_ 지정자는 변수 지정자와 열포인터를 함께 사용 있으며, PUT 구문 어디에서나 위치 있다.
    영향 : PUT 구문에서 이전에 열포인터를 사용하여 해당 열에 대한 변수를 지정하지 않은 경우에만 _ODS_ 옵션이 지정한 열에 데이터를 작성한다. , 사전에 열에 대한 변수를 설정하면 _ODS_옵션은 제어된다.
    참고 : SAS Output Delivery System: User's Guide 에서 “PUT Statement for ODS ”

     

    4) @|@@

       데이터 스텝의 반복수행과정 중에서 다음 차례의 PUT 구문에서 사용할 수 있도록 현재 위치에 출력 라인을 유지한다. 이 행 고정 지정자(line-hold specifier) 는 후행 @ 와 이중 후행 @ 라고 한다. 후행 @ 또는 이중 후행 @ 는 PUT 구문에서 마지막 항목으로 작성해야 한다. 일반적으로 현재 위치에서 포인터를 유지하기 위하여 @ 또는 @@를 사용한다.

     

    제한사항 : 후행 @ 또는 이중 후행 @ PUT 구문에서 마지막 항목으로 작성해야 한다.
    Tip : 현재 위치에서 포인터를 유지하기 위하여 @ 또는 @@ 사용하라. 이후에 실행되는 PUT 구문은 새로운 출력 라인으로 이동하지 않고 동일 출력라인에 데이터를 작성한다.
    참고 : 행고정지정자(Line-Hold Specifiers) 사용하기
    주요기능 : 예제5 : 출력 라인 유지와 해제

     


    5) 열 포인터 조절자

       (1) @n

         포인터를 n열(양수)로 이동한다.

    범위 : 양수
    예제 : @15 NAME 값이 작성되기 전에 15열로 포인터를 이동한다.

    put @15 name $10.;
    주요기능 : 예제2 : 페이지 안에 포인터를 이동하기

     

       (2) @numeric-variable

         수치형 변수의 값에 의해 지정된 열로 포인터를 이동한다.

     

    범위 : 양수
    Tip : n 값이 정수가 아니면, SAS 소수 부분을 제외하고 정수 부분을 사용한다. n 값이 또는 음수이면, 포인터는 1열로 이동한다.
    예제 : A변수의 값은 NAME 변수의 값이 작성되기 전에 15열로 포인터를 이동한다.

    a=15;put @a name $10.;
    주요기능 : 예제2 : 페이지 안에 포인터를 이동하기

     

       (3) @(expression)

         표현식(expression) 값에 의해 지정된 열로 포인터를 이동한다.

     

    범위 : 양수
    Tip : 표현식의 값이 정수가 아니면, SAS 소수 부분을 제외하고 정수 부분을 사용한다. n 또는 음수이면, 포인터는 1열로 이동한다.
    예제 : 표현식의 결과는 NMAE 변수의 값이 작성되기 전에 15열로 포인터를 이동한다.

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

     

       (4) +n

         포인터를 n개의 열만큼 오른쪽으로 이동한다.

     

    범위 : 양수 또는
    Tip : n 정수가 아니면, 소수 부분을 제외하고 정수 부분을 사용한다.
    예제 : 다음 문장은 포인터를 23열로 이동하고, 23-26열에 LENGTH변수의 값을 작성한다. 그리고, 포인터를 5개의 만큼 오른쪽으로 이동 후에 32-35열에 WIDTH 변수의 값을 작성한다.

    put @23 length 4. +5 width 4.;

     

       (5) +numeric-variable

         수치형 변수에 의하여 주어진 열의 개수만큼 포인터를 오른쪽으로 이동한다. 값이 출력 버퍼의 길이보다 길면, 현재 라인에 값을 출력한 후에 포인터는 다음 라인의 첫 번째 열로 이동한다.

     

    범위 : 양수, 음수, 또는
    Tip : 수치형 변수의 결과값이 정수가 아니면, 소수점을 제외하고 정수 부분을 사용한다. 수치형 변수의 값이 음수이면, 포인터를 왼쪽으로 이동한다. 이동하는 포인터의 위치가 1보다 작아지면, 포인터는 번째 열로 이동한다. 값이 영이면, 포인터는 이동하지 않는다.

    값이 출력버퍼의 길이보다 길면, 현재 라인에 출력 이후에 포인터는 다음 라인의 번째 열로 이동한다.

     

       (6) +(expression)

         표현식에 의하여 반환되는 열의 수만큼 포인터를 오른쪽으로 이동한다. 값이 출력 버퍼의 길이보다 길면, 현재 라인에 값을 출력하고 포인터는 다음 라인의 첫 번째 열로 이동한다. 표현식의 결과값은 정수이어야 한다.

     

    범위 : 표현식의 결과값은 정수이어야 한다.
    Tip : : 표현식이 정수가 아니면, 소수 부분을 제외하고 정수 부분을 사용한다. 표현식이 음수이면, 포인터를 왼쪽으로 이동한다. 이동하는 포인터의 위치가 1보다 작아지면, 포인터는 번째 열로 이동한다. 값이 영이면, 포인터는 이동하지 않는다.

    값이 출력 버퍼의 길이보다 길면, 현재 라인에 값을 출력하고 포인터는 다음 라인의 번째 열로 이동한다.
    주요기능 : 예제2 : 페이지 안에 포인터를 이동하기

     


    6) 행 포인터 조절자

       (1) #n

         n번째 라인의 첫 번째 열로 포인터를 이동한다.

    범위 : 양수
    예제 : 번째 라인에 Name변수를 작성하고, #2 의해 포인터를 번째 라인으로 이동하여 3~4열에 ID변수의 값을 작성한다.

    put @12 name $10. #2 id 3-4;

     

       (2) #numeric-variable

         수치형 변수에 의하여 주어진 라인의 첫 번째 열로 포인터를 이동한다.

    범위 : 양수
    Tip : 수치형 변수의 값이 정수가 아니면, 소수 부분을 제외하고 정수 부분을 사용한다.

     

       (3) #(expression)

         표현식에 의하여 주어진 라인의 첫 번째 열로 포인터를 이동한다. 표현식 결과값은 양수로 지정해야 한다.

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

     

       (4) /

         바로 다음 라인의 첫 번째 열로 포인터를 이동한다.

    예제 : NAME AGE변수의 값이 동일 라인에 작성 이후에 포인터를 번째 라인으로 이동하여 3-4열에 ID변수의 값을 작성한다.

    put name age / id 3-4;
    주요기능 : 예제3 : 새로운 페이지로 포인터 이동하기

     

       (5) OVERPRINT

         가장 최근에 작성된 출력 라인 위에 OVERPRINT 키워드 바로 뒤에 위치하는 값을 출력한다. OVERPRINT 옵션은 출력을 위하여 작성되는 출력 라인에는 영향을 주지 않는다.

     

    필요사항 : 파일에 직접 출력되어야 한다. FILE 구문에서 N=옵션을 1 설정하고, PUT 구문이 파일에 출력되도록 지시하라.
    Tip : OVERPRINT 옵션은 출력을 위하여 작성되는 출력 라인에는 영향을 미치지 않는다.
    Tip : 텍스트에 겹쳐서 인쇄하기 위하여 열포인터와 행포인터를 OVERPRINT 옵션과 함께 지정하라.
    예제 : 다음 문장은 15열을 시작으로 타이틀 아래에 밑줄을 겹쳐서 인쇄한다.
     
    put @15 'Report Title' overprint
    @15 '____________';
    주요기능 : 예제4 : 텍스트에 밑줄 긋기

     

       (6) _BLANKPAGE_

         포인터가 새로운 페이지에서 첫 번째 라인의 첫 번째 열에 위치하고 있더라도 다음 페이지의 첫 번째 라인으로 포인터를 이동시킨다.

    Tip : 현재 출력 파일이 카드 제어(carriage-control) 문자를 포함하면, _BLANKPAGE_ 적절한 카드 제어 문자를 포함하는 출력 라인을 생성한다.
    주요기능 : 예제3 : 새로운 페이지로 포인터 이동하기

     

       (7) _PAGE_

         새로운 페이지의 첫 번째 라인으로 포인터를 이동한다. 라인이 현재 지정되어 있는 PAGESIZE= 옵션 값을 초과하면 자동적으로 새로운 페이지를 시작한다.

    Tip : 현재 출력 파일을 출력하면, _PAGE_ 적절한 카드 제어 문자를 포함하는 출력 라인을 생성한다. _PAGE_ 직접 출력되지 않는 파일에는 영향이 없다.
    Tip : 대화식 SAS세션에서 FILE PRINT 지정하면, 출력 윈도우는 페이지 바꿈(form-feed) 조절자 문자를 페이지 나누기(page breaks) 명령으로 해석하여 페이지 바꿈 조절자를 출력에서 제거한다. 결과 파일은 페이지 나누기 문자가 포함되지 않는 플랫(flat) 파일을 생성한다. 파일이 페이지 바꿈 문자를 포함해야 필요가 있으면, FILE 구문에 물리적 파일 위치와 PRINT옵션을 지정하라.
    주요기능 : 예제3 : 새로운 페이지로 포인터 이동하기

     


    3. 범 주

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

     


    4. 상세 설명

     

    • PUT 구문 사용 시기
    • 출력 방법(Output Styles)
      • 1) 출력 방법 소개
      • 2) 열 출력 방식(Column Output)
      • 3) 목록 출력 방식(List Output)
      • 4) 출력형식 지정 출력 방식(Formatted Output)
      • 5) 변수 이름 지정 출력 방식(Named Output)
    • 단일 PUT 구문에서 다중 출력스타일 사용하기
    • 문자상수와 변수를 함께 작성할 때에 일반적인 에러 피하기
    • 포인터 조절자 (Pointer Controls)
    • 행고정지정자(Line-Hold Specifiers) 사용하기
    • 값이 작성된 이후 포인터 위치
    • 포인터가 라인의 끝을 경유 할 때
    • 배열

     


    PUT 구문 사용 시기

    SAS로그, SAS출력 윈도우 또는 외부 파일에서 출력 라인을 작성하기 위하여 PUT 구문을 사용한다. 데이터스텝의 현재 반복에서 PUT 구문 전에 FILE 구문을 지정하지 않으면, 기본적으로 SAS로그에 출력 라인을 작성한다. FILE 구문에서 PRINT옵션을 지정하면, SAS 출력 윈도우에 출력 라인을 작성한다.

     

    PUT 구문은 변수의 데이터 , 문자열, 16진수 문자 상수를 포함하는 출력 라인을 작성 있다. PUT 구문의 specifications 작성 대상, 위치, 출력 형식 방법 등을 지정하라.

     


    출력 방법(Output Styles)

    1) 출력 방법 소개

    PUT 구문을 사용하여 변수의 값을 작성하기 위하여 4가지 방법이 있다.

    • 열 출력 방식(column Output)
    • 단순 / 수정된 목록 출력 방식(List Output)
    • 출력형식 지정 출력 방식(Formatted Output)
    • 변수 이름 지정 출력 방식(Named Output)

     

    단일 PUT 구문에서 출력 스타일의 일부 또는 전체를 함께 사용 있다.

     

    2) 열 출력 방식(Column Output)

    PUT 구문에서 변수 뒤에 출력되는 열번호를 지정한다. 다음 구문에서 변수 뒤의 번호는 값이 작성되는 열의 위치를 지정한다.

    SAS Statements
    put name 6-15 age 17-19;

     

    다음 라인이 SAS로그에 작성된다.

     

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

     

    PUT 구문은 지정된 열에 NAME AGE변수의 값을 작성한다.

     

    참고 : PUT 구문, 출력 방식
    참고 : 열지시자는 출력 결과를 설명하기 위하여 표시되는 라인이다. 실제 PUT 구문으로는 생성되지 않는다.

     

    3) 목록 출력 방식(List Output)

    PUT 구문에서 작성을 원하는 순서로 변수와 문자열을 나열하라. 예를 들어, 다음 PUT 구문은

    SAS Statements
    put name age;

     

    SAS로그에 NAME AGE변수값을 작성한다.

     

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

     

    참고 : PUT 구문, 목록 출력 방식

     

    4) 출력형식 지정 출력 방식(Formatted Output)

    변수 이름 뒤에 SAS 출력형식(format) 또는 사용자정의 출력형식(format) 지정하라. 출력형식(format) 변수값을 작성하는 방법에 대한 지침을 제시한다. 출력형식(Format)으로 압축된 10진수와 같은 비표준 형식 데이터, 콤마와 같은 특수문자가 포함된 숫자를 작성 있다. -L, -C, -R 사용하여 포맷이 지정된 출력 방식의 기본 정렬을 변경 있다.

     

    예로 다음 PUT 구문은

    SAS Statements
    put name $char10. age 2. +1 date mmddyy10.;

     

    SAS로그에 NAME, AGE, DATE변수의 값을 작성한다.

     

    ----+----1----+----2----+
    
    Peterson  21 07/18/1999
    
    Morgan    17 11/12/1999

     

    +1 포인터 조절자는 AGE DATE 변수 사이에 공백을 삽입한다.

    참고 : PUT 구문, 출력 형식 지정 출력 방식

     

    5) 변수 이름 지정 출력 방식(Named Output)

    변수 이름 뒤에 등호를 작성한다.

     

    예로 다음 PUT 구문은

    SAS Statements
    put name= age=;

     

    SAS로그에 NAME AGE변수의 값을 작성한다.

     

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

     

    열지시자는 출력 결과를 설명하기 위하여 표시된 라인이다. 실제 PUT 구문으로는 생성되지 않는다.

    참고 : PUT 구문, 변수 이름 지정 출력 방식

     


    단일 PUT 구문에서 다중 출력스타일 사용하기

    PUT 구문은 출력 형식의 일부 또는 전체를 함께 사용 있다. 다음 예제를 참고.

    SAS Statements
    put name 'on ' date mmddyy8. ' weighs ' startwght +(-1) '.' idno= 40-45;

     

    SAS로그에 작성되는 라인에 대한 설명은 예제1 참고하라.

     

    여러 출력형식을 함께 사용하는 경우에 값을 작성한 이후에 출력포인터 위치를 이해하는 것이 중요하다. 포인터 위치에 대한 상세한 정보는값이 작성된 이후 포인터 위치 참고하라.

     


    문자상수와 변수를 함께 작성할 때에 일반적인 에러 피하기

    PUT 구문에서 변수 이름 앞에 문자상수를 작성하는 경우에 문자상수 뒤쪽 인용부호와 변수 이름 사이에 공백을 항상 삽입하라.

    SAS Statements
    put 'Player:' name1 'Player:' name2 'Player:' name3;

     

    그렇지 않으면, 변수 이름 앞의 단순한 문자상수를 다음 테이블에서 설명되는 것처럼 특별한 SAS 상수로 해석한다.

     

      [특별한 SAS 상수]

    변수 시작 문자 표현 예제
    b 비트 테스팅 상수 '00100000'b
    d 날짜 상수 '01jan04'd
    dt 날짜시간 상수 '18jan2003:9:27:05am'dt
    n SAS 이름 상수 'My Table'n
    t 시간 상수 '9:25:19pm't
    x 16진수 표기법 '534153'x

     

    변수 이름 앞에 문자 상수를 사용하는 방법에 대하여는 예제7 : 변수 이름 앞에 문자 상수를 사용하는 경우에 일반적인 에러 방지하기 참고.

     

    표현식에서 SAS 이름 상수와 SAS 상수에 관한 상세한 정보는 SAS Language Reference: Concepts 에서 “SAS name literals and SAS constants in expressions “ 참고.

     


    포인터 조절자 (Pointer Controls)

    SAS PUT 구문을 사용하여서 값을 작성 때에 포인터의 위치를 추적하다. PUT 구문은 포인터의 위치를 관리하기 위하여 3가지 방법을 사용한다.

     

    • 열포인터 조절자

           : PUT 구문이 출력 라인에 값을 작성하기 시작하는 경우에 포인터의 열위치를 재설정한다.

     

    • 행포인터 조절자(/)

           : PUT 구문이 출력 라인에 값을 작성하기 시작하는 경우에 포인터의 위치를 재설정한다.

     

    • 행고정 지정자

           : 출력 버퍼에서 라인을 유지하여서 다음 PUT 구문이 해당 라인에 바로 작성 있도록 한다. 기본적으로 행고정지정자(line-hold specifiers) 사용하지 않으면 PUT 구문은 현재 라인의 고정 상태를 해제하고 새로운 라인에 작성한다.

     

    열과 포인터 조절자를 사용하여 포인터를 이동시키기 위하여 절대 라인번호와 열번호를 지정하거나 현재 포인터 위치에서 상대적인 또는 라인 위치를 지정 있다.

     

    다음 테이블은 PUT 구문에서 사용 있는 포인터 조절자 목록이다.

     

     

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

    포인터 조절자 상대 절대
    열포인터 조절자 +n @n
    +numeric-variable @numeric-variable
    +(expression) @(expression)
    행포인터 조절자 / , _PAGE_ ,
    _BLANKPAGE_
    #n
    #numeric-variable
    #(expression)
    OVERPRINT none
    행고정 지정자 @ 해당사항 없음
    @@ 해당사항 없음

     


    행고정지정자(Line-Hold Specifiers) 사용하기

    행고정지정자는 다음과 같은 목적으로 현재 출력 라인에서 포인터를 유지한다.

     

    • 동일 출력 라인에 하나 이상의 PUT 구문을 작성한다.
    • PUT 구문이 동일 출력 라인에 하나 이상의 관측치에 대한 값을 작성하는 경우

     

    행고정지정자를 사용하지 않으면 데이터 스텝에서 개별 PUT 구문은 새로운 출력 라인에 작성된다.

     

    PUT 구문에서 후행 @ 이중 후행 @@ 동일한 효과를 가진다. 데이터스텝이 새로운 반복을 시작하는 경우에 INPUT 구문과 다르게 PUT 구문은 후행 @ 의하여 유지되고 있는 라인을 자동적으로 해제하지 않는다. 후행 @ 또는 이중 후행 @ 의하여 유지되고 있는 현재 출력 라인은 다음 조건을 만나는 경우에 해제된다.

     

    • 후행 @ 없는 PUT 구문의 실행
    • _BLANKPAGE_ 또는 _PAGE_ 옵션이 실행되는 PUT 구문
    • 현재 라인의 끝(LRECL=, FILE 구문의 LINESIZE 옵션 또는 LINESIZE 시스템 옵션의 현재 값으로 지정된 값)
    • 데이터 스텝에서 마지막 반복의 종료

     

    후행 @ 또는 이중 후행 @ 사용하면 포인터 값이 다음 차례의 PUT 구문이 실행 때까지 변경되지 않기 때문에 SAS 현재 라인 길이를 경유하여 다음 라인에 작성 있다.

    참고 : 포인터가 라인의 끝을 경유

     


    값이 작성된 이후 포인터 위치

    값이 작성된 이후에 출력 포인터의 위치를 이해하는 것은 중요하다. 특히 단일 PUT 구문에서 여러 출력 형식을 사용 중요하다. 값이 작성된 이후의 포인터 위치는 사용하는 출력형식과 문자열 또는 변수의 작성 여부에 따라 달라진다. 출력 방식 또는 출력형식 지정 출력 방식을 사용하는 경우에 포인터는 PUT 구문에서 지정된 필드의 부분 이후에 번째 열에 위치한다. 위의 가지 출력 형식은 변수값을 작성하기 위하여 사용한다.

     

    목록 출력 방식 또는 변수 이름 지정 출력 방식을 사용하는 경우에 PUT 구문은 개별값이 작성된 이후에 자동적으로 하나의 열을 삽입하기 때문에 포인터는 변수값 이후 번째 열에 위치한다. 그러나, PUT 구문이 문자열을 작성하기 위하여 목록 출력 방식을 사용하는 경우에 포인터는 문자열 이후 번째 열에 위치한다. 문자열이 작성된 이후에 행포인터 조절자 또는 열출력 방식을 사용하지 않으면, 다음에 존재하는 값과 구분하기 위하여 문자열 부분에 공백이 추가된다.

     

    _INFILE_ 지정자가 지정된 경우에 포인터는 현재 입력 파일의 레코드가 작성된 이후에 번째 열에 위치한다.

     

    출력포인터가 페이지의 좌측 상단에 존재하는 경우에

    • PUT _BLANKPAGE_ 옵션은 공백 페이지를 작성한 이후에 다음 페이지 상단으로 포인터가 이동한다.
    • PUT _PAGE_ 옵션은 동일 위치에 포인터를 유지한다.

     

    FILE 구문에서 COLUMN= 옵션과 LINE= 옵션으로 지정된 변수를 평가하여 현재 포인터의 위치를 정의 있다.

     


    포인터가 라인의 끝을 경유 할 때

    일반적으로 현재 지정된 출력 라인 길이 보다 출력 라인을 작성하지 않는다. 현재 출력 파일의 라인 길이는 다음 항목에 의해 결정된다.

     

    • 현재 FILE 구문에서 LINESIZE= 옵션의 값
    • SAS출력윈도우에 대한 LINESIZE=시스템 옵션의 값
    • 현재 FILE 구문에서 외부파일에 대한 LRECL= 옵션

     

    다음 지정자 중에 하나를 사용하는 경우에 의도하지 않게 현재 라인 길이를 지나서 다음 라인에 포인터가 이동 있다.

     

    • 현재 라인 길이 너머의 열로 포인터를 이동시키는 값을 가지는 + 포인터 조절자
    • 현재 라인 길이를 초과하는 열 범위를 지정 (예, 현재라인 길이가 80인 경우에 PUT 90-100 을 지정)
    • 현재 출력 라인의 나머지 공간에 적합하지 않은 문자값 또는 문자열

     

    기본적으로, PUT 구문은 현재 라인의 끝을 지나서 작성하려고 시도하는 경우에 현재 라인을 지나는 항목의 작성을 일단 보류하고, 먼저 현재 라인에 작성 가능한 값을 작성하고 새로운 라인의 번째 열에 남은 항목을 작성한다.

    참고 : “FILE 구문에서 FLOWOVER, DROPOVER, STOPOVER 옵션

     


    배열

    PUT 구문을 사용하여 배열 원소를 작성 있다. PUT 구문이 실행되는 경우에 첨자는 정수로 반환되는 SAS 표현식을 사용한다. 아래와 같이 배열 참조를 괄호 안에 작성하면 포인터 조절자와 함께 수치형 변수 구조로 배열참조를 사용 있다.

     

    • @(array-name{i})
    • +(array-name{i})
    • #(array-name{i})

     

    사전에 정의된 배열의 모든 원소를 작성하기 위하여 배열첨자 별표(*) 사용하라. 1차원 또는 다차원배열은 사용가능 하지만, 임시(_TEMPORARY_) 배열은 사용 없다. 첨자를 대괄호({}), 중괄호([]) 또는 소괄호(()) 안에 작성하여서 목록, 출력형식 지정 방식, 방식 또는 변수 이름 지정 출력 방식과 함께 배열을 출력한다.

     

    목록 출력 방식의 형태는 다음과 같다.

    SAS Statements
    PUT array-name{*};

     

    출력형식 지정 출력 방식의 형태는 다음과 같다.

    SAS Statements
    PUT array-name{*}(format|format.list)

     

    배열 참조 바로 뒤의 괄호 안에 출력형식(format) 지정해야 한다.

     


    5. 비교 사항

    • PUT 구문은 SAS 로그 또는 외부 위치에 변수값 또는 문자열을 작성한다. INPUT 구문은 외부파일 또는 내부데이터 라인에 존재하는 원시데이터를 읽는다.
    • INPUT 구문과 PUT 구문은 모두 입력 또는 출력버퍼에서 현재 라인을 유지하기 위하여 후행 @ 과 이중 후행 @ 행고정지정자를 사용한다. INPUT 구문에서 이중 후행 @ 는 데이터 스텝의 현재 반복에서 다음 반복까지 입력 버퍼에서 현재 라인을 유지한다. 그러나 PUT 구문에서 후행 @ 는 이중 후행 @와 동일한 효과를 가진다. 양쪽 모두 데이터스텝의 반복 수행 과정에서 라인을 유지(고정)한다.
    • PUT 구문과 OUTPUT 구문 모두 데이터 스텝에서 출력물을 생성한다. PUT 구문은 출력버퍼를 사용하여서 외부파일, SAS로그 또는 모니터에 출력라인을 작성한다. OUTPUT 구문은 프로그램 데이터 벡터(PDV)를 사용하여서 SAS 데이터세트에 관측치를 작성한다.

     


    6. 관련 구문

    구문명 구문함수
    FILE 구문 PUT 구문에서 사용되는 출력 대상 파일의 이름을 지정한다. 
    PUT 구문 가장 최근 FILE 구문에서 지정한 SAS 로그, SAS 출력 윈도우, 또는 외부 파일 등에 출력 라인을 작성한다.
    PUT 구문, 열 출력 방식 출력 라인의 지정된 열에 변숫값을 작성한다.
    PUT 구문, 출력형식 지정 출력방식 출력 라인에 지정된 출력 형식(format)으로 변수의 값을 작성한다
    PUT 구문, 목록 출력 방식 지정된 출력 라인에 변수의 값과 지정한 문자열을 작성한다.
    PUT 구문, 변수이름 지정 출력 방식 "변수명 = " 바로 뒤에 변수 값을 작성한다.
    PUTLOG SAS 로그에 지정한 메시지를 출력한다.
    LINESIZE= 시스템 옵션  
    PAGESIZE= 시스템 옵션  

     


    7. 예 제

    예제1 : 단일 PUT 구문에서 여러 출력 방식 함께 사용하기

    다음 예제는 단일 PUT 구문에서 일부 출력 형식을 함께 사용한다.

     

    SAS Program
    options yearcutoff= 1920;  
     
    data club1;
       input idno name $ startwght date : date7.;
       put name 'on ' date mmddyy8. ' weighs '
           startwght +(-1) '.' idno= 32-40;
       datalines;
    032 David 180 25nov99
    049 Amelia 145 25nov99
    219 Alan 210 12nov99
    ;

     

    다음 테이블은 예제에서 개별변수에 적용되는 출력형식을 보여준다.

     

    변수 출력 형식
    NAME, STARTWGHT 목록 출력 방식
    DATE 출력형식 지정 출력 방식
    IDNO 변수 이름 지정 출력 방식

     

    PUT 구문은 포인터 조절자 문자열과 변수 이름을 모두 지정한다.

     

    프로그램은 SAS로그에 다음 라인을 작성한다

     

    [LOG 출력결과]

    Results
    ----+----1----+----2----+----3----+----4
    David on 11/25/99 weighs 180.  idno=1032
    Amelia on 11/25/99 weighs 145. idno=1049
    Alan on 11/12/99 weighs 210.   idno=1219

     

    열지시자는 출력 결과를 설명하기 위하여 표시된 라인이다. 실제 PUT 구문으로는 생성되지 않는다.

     

    포인터 위치를 변경하기 위하여 문자열의 시작과 끝에 공백이 삽입되었다. 공백은 문자열과 변수의 값을 구분한다. +(-1) 포인터 조절자는 STARTWGHT 변수의 값과 마침표(.) 사이에 불필요한 공백을 제거하기 위하여 포인터를 (왼쪽) 이동한다.

     


    예제2 : 페이지 안에 포인터를 이동하기.

    다음 PUT 구문은 출력 포인터 위치를 지정하기 위하여 열과 행포인터 조절자를 사용한다.

     

    • 지정한 열로 포인터를 이동하기 위하여, @ 뒤에 이동하기 원하는 열번호의 값을 포함하는 열번호, 변수 또는 표현식을 지정한다. 예를 들어, 다음 문장은 15열로 포인터를 이동 한 후에 목록 출력 방식을 사용하여 TOTAL SALES 변수의 값을 작성한다.

     

    put @15 totalsales;

     

    다음 PUT 구문은 COLUMN변수에서 지정된 값으로 포인터를 이동하고, COMMA6 출력형식을 사용하여 TOTALSALES변수의 값을 작성한다.

     

    SAS Program
    data _null_;
    
       set carsales;
    
       column=15;
    
       put @column totalsales comma6.;
    
    run;

     

    • 다음 프로그램은 포인터를 뒤로 이동시키기 위하여 2가지 방법을 사용한다.

     

    SAS Program
    data carsales;
       input item $10. jan : comma5.
             feb : comma5. mar : comma5.;
       saleqtr1=sum(jan,feb,mar);
    /* 표현식을 사용하여 포인터를 뒤(왼쪽)로 이동 */
       put '1st qtr sales for ' item
           'is ' saleqtr1 : comma6. +(-1) '.';
    /* 음수 값을 소유한 수치형 변수를 사용하여 포인터를 뒤(왼쪽)로 이동 */
       x=-1;
       put '1st qtr sales for ' item
           'is ' saleqtr1 : comma5. +x '.';
       datalines;
    trucks         1,382     2,789     3,556
    vans           1,265     2,543     3,987
    sedans         2,391     3,011     3,658
    ;

     

    수정된 목록 출력 방식으로 SALEQTR1 변수의 값이 작성되기 때문에 포인터는 자동으로 2 이동한다. 값과 마침표 사이에 불필요한 공백을 제거하기 위하여 포인터를 (왼쪽) 이동시킨다.

     

    프로그램은 SAS로그에 다음 라인을 작성한다.

     

    Results
    ----+----1----+----2----+----3----+----4
    st qtr sales for trucks is 7,727.
    st qtr sales for trucks is 7,727.
    st qtr sales for vans is 7,795.
    st qtr sales for vans is 7,795.
    st qtr sales for sedans is 9,060.
    st qtr sales for sedans is 9,060.

     

    참고 : 열지시자는 출력 결과를 설명하기 위하여 표시되는 라인이다. 실제 PUT 구문으로는 생성되지 않는다.

     

    • 다음 프로그램은 PUT 구문에서 행포인터(/) 조절자를 사용하여서 포인터를 다음 출력라인으로 이동시킨다.
    SAS Program
    data _null_;
       set carsales end=lastrec;
       totalsales+saleqtr1;
       if lastrec then
         put @2 'Total Sales for 1st Qtr'
             / totalsales 10-15;
    run;

     

    데이터스텝은 CARSALES 데이터세트의 모든 관측치에 대하여 TOTALSALES 변수에 대한 연산을 수행한 후에 PUT 구문을 실행한다. 번째 열에 문자열을 작성하고 다음 라인으로 이동하여 10-15열에 TOTSLALES 변수의 값을 작성한다.

     

    [LOG 출력결과]

    Results
    ----+----1----+----2----+----3
     Total Sales for 1st Qtr
              24582

     

    참고 : 열지시자는 출력 결과를 설명하기 위하여 표시되는 라인이다. 실제 PUT 구문으로는 생성되지 않는다.

     


    예제3 : 새로운 페이지로 포인터 이동하기

    다음 예제는 수도권과 비수도권 지역에 대한 1990 미국인구조사정보를 포함하는 STATEPOP 데이터세트를 생성한다. 50개주와 4 지역의 컬럼비아 특별구로 그룹화하기 위하여 FORMAT프로시져를 사용한다.

     

    출력물을 관리하기 위하여 IF 구문과 PUT 구문을 사용한다.

     

    SAS Program
    options pagesize=24 linesize=64 nodate pageno=1;
     
    title1;
     
    data statepop;
       input state $ cityp90 ncityp90 region @@;
       label cityp90= '1990 metropolitan population
                            (million)'
             ncityp90='1990 nonmetropolitan population
                            (million)'
             region=  'Geographic region';
       datalines;
    ME    .443    .785  1   NH    .659    .450  1
    VT    .152    .411  1   MA   5.788    .229  1
    RI    .938    .065  1   CT   3.148    .140  1
    NY  16.515   1.475  1   NJ   7.730     .A   1
    PA  10.083   1.799  1   DE    .553    .113  2
    MD   4.439    .343  2   DC    .607      .   2
    VA   4.773   1.414  2   WV    .748   1.045  2
    NC   4.376   2.253  2   SC   2.423   1.064  2
    GA   4.352   2.127  2   FL  12.023    .915  2
    KY   1.780   1.906  2   TN   3.298   1.579  2
    AL   2.710   1.331  2   MS    .776   1.798  2
    AR   1.040   1.311  2   LA   3.160   1.060  2
    OK   1.870   1.276  2   TX  14.166   2.821  2
    OH   8.826   2.021  3   IN   3.962   1.582  3
    IL   9.574   1.857  3   MI   7.698   1.598  3
    WI   3.331   1.561  3   MN   3.011   1.364  3
    IA   1.200   1.577  3   MO   3.491   1.626  3
    ND    .257    .381  3   SD    .221    .475  3
    NE    .787    .791  3   KS   1.333   1.145  3
    MT    .191    .608  4   ID    .296    .711  4
    WY    .134    .319  4   CO   2.686    .608  4
    NM    .842    .673  4   AZ   3.106    .559  4
    UT   1.336    .387  4   NV   1.014    .183  4
    WA   4.036    .830  4   OR   1.985    .858  4
    CA  28.799    .961  4   AK    .226    .324  4
    HI    .836    .272  4
    ;
     
    proc format;
       value regfmt 1='Northeast'
                    2='South'
                    3='Midwest'
                    4='West';
    run;
     
    data _null_;
       set statepop;
       by region;
       pop90=sum(cityp90,ncityp90);
       file print;
       put state 1-2 @5 pop90 7.3 ' million';
       if first.region then
          regioncitypop=0;      /* new region */
       regioncitypop+cityp90;
       if last.region then
          do;
             put // '1990 US CENSUS for ' region regfmt.
                  / 'Total Urban Population: '
                     regioncitypop' million' _page_;
          end;
    run;

     

    [OUTPUT 출력결과]

    Results
    ME    1.228 million
    NH    1.109 million
    VT    0.563 million
    MA    6.017 million
    RI    1.003 million
    CT    3.288 million
    NY   17.990 million
    NJ    7.730 million
    PA   11.882 million
     
    1990 US CENSUS for Northeast
    Total Urban Population: 45.456  million

     

    LAST.REGION 내부 변수의 값이 1 지정 때마다 PUT _PAGE_ 옵션에 의하여 포인터는 새로운 페이지의 번째 라인으로 이동한다. 새로운 페이지로 이동하기 전에 모든 페이지 하단에 메시지를 출력한다.

     

    예제4 : 텍스트에 밑줄 긋기

    다음 예제는 이전 PUT 구문에서 작성된 값에 밑줄을 추가하기 위하여 OVERPRINT 옵션을 사용한다.

     

    SAS Program
    data _null_;
       input idno name $ startwght;
       file file-specification print;
       put name 1-10 @15 startwght 3.;
       if startwght > 200 then
         put overprint @15 '___';
       datalines;
    032 David 180
    049 Amelia 145
    219 Alan 210
    ;

     

    번째 PUT 구문은 번째 PUT 구문이 출력한 출력 라인 위에 weight 200보다 곳에 밑줄을 긋는다.

     

    다음 PUT 구문은 OVERPRINT옵션에 열포인터 조절자와 행포인터 조절자를 함께 사용한다.

     

    SAS Program
    put @5 name $8. overprint @5 8*'_'
    
         / @20 address;

     

    PUT 구문은 NAME 변수의 값을 작성하고, 8자리 밑줄을 덮어쓰고, ADDRESS값을 작성하기 위하여 다음 라인으로 출력포인터를 이동한다.

     


    예제5 : 출력 라인 유지와 해제

    다음 데이터스텝은 PUT 구문에서 출력 라인에 대한 유지 해제 방법을 설명한다.

     

    SAS Program
    data _null_;
       input idno name $ startwght 3.;
       put name @;
       if startwght ne . then
         put @15 startwght;
       else put;
       datalines;
    032 David 180
    049 Amelia 145
    126 Monica
    219 Alan 210
    ;

     

    예제에서,

     

    • 첫 번째 PUT 구문에서 후행 @는 NAME 변수의 값을 작성 후에 현재 출력 라인을 유지한다.
    • 조건이 IF-THEN 구문을 충족하면, 두 번째 PUT 구문은 STARTWGHT 변수의 값을 작성하고, 현재 출력 라인을 해제한다.
    • 조건을 충족하지 못하면, 두 번째 PUT 구문은 실행되지 않고, ELSE PUT 구문이 실행된다. ELSE PUT 구문은 출력 라인을 해제하고, 출력 버퍼의 첫 번째 열에 출력포인터를 위치시킨다.

     

    프로그램은 로그에 다음 라인을 작성한다.

     

    [LOG 출력결과]

    Results
    ----+----1----+----2
    David         180
    Amelia        145
    Monica
    Alan          210

     

    참고 : 열지시자는 출력 결과를 설명하기 위하여 표시되는 라인이다. 실제 PUT 구문으로는 생성되지 않는다.

     


    예제6 : 로그에 현재 입력 레코드 작성하기

    ID 변수의 값이 1000보다 적은 경우에 PUT _INFILE_ 실행하고 SAS로그에 현재 입력 레코드를 작성한다. DELETE 구문은 TEAM데이터 세트에 해당 관측치를 출력하지 않는다.

     

    SAS Program
    data team;
       input id team $ score1 score2;
       if id le 1000 then
         do;
           put _infile_;
           delete;
         end;
       datalines;
    1032 red 180 165
    1049 yellow 145 124
    219  red 210 192
    ;

     

    프로그램은 SAS로그에 다음 라인을 작성한다.

     

    [LOG 출력결과]

    Results
    ----+----1----+----2
    219 red 210 192

     


    예제7 : 변수 이름 앞에 문자 상수를 사용하는 경우에 일반적인 에러 방지하기

    다음은 PUT 구문에서 문자 상수와 변수를 작성하는 경우에 SAS 이름 상수로 잘못 처리되는 것을 방지하는 예제이다. SAS 이름 상수는 다음 형태로 표현되는 이름 토큰(Name token)이다.

     

    '문자열'n

     

    아래 프로그램에서 PUT 구문은 상수를 작성한다.

     

    SAS Program
    data _null_;
       n=5;
       nvar1=1;
       var1=7;
       put @1 'n' nvar1 'n';
    run;

     

    프로그램은 SAS로그에 다음 라인을 작성한다.

    Results
    ----+----1----+----2
    n1 n

     

    이전 PUT 구문에서 상수와 변수 사이에 모든 공백이 제거되면 'n' 상수로 해석하지 않고 이름 상수로 해석한다. 다음 변수는 NVAR1 변수로 처리하지 않고 VAR1 변수로 처리한다. 마지막 'n' 상수는 문자 상수로 처리된다.

     

    SAS Program
    put @1 'n'nvar1'n';

     

    다음 PUT 구문은 SAS로그에 다음 라인을 작성한다.

    Results
    ----+----1----+----2
    5 7 n

     

    잠재적인 오해 없이 문자상수와 변수값을 올바르게 출력하기 위하여 PUT 구문에서 중간에 공백을 추가하거나 필요한 포인터 조절자를 사용하라. 예를 들어, 다음은 문자상수와 변수를 올바르게 작성하기 위하여 PUT 구문에서 공백을 대신하여 포인터 조절자를 사용한다. +(-1) PUT 구문 포인터를 왼쪽으로 이동시킨다.

     

    SAS Program
    put @1 'n' nvar1 +(-1) 'n';

     

    PUT 구문은 SAS로그에 다음 라인을 작성한다.

     

    Results
    ----+----1----+----2
    n1n

     


    예제8 : 다중 열 출력하기

    다음 예제는 다수의 열에 출력물을 생성하기 위하여 포인터 조절자 포인터 조절자를 사용한다.

     

    열을 우선 순서로 하여 4개열에 name weight 변수의 값을 출력하기 위하여 #i @j 사용한다. 4번째 (j+3) 번째 행을 시작으로 8번째 열까지 작성된 후에, 다시 4번째 (j+3) 20번째 행으로 이동하여서 다시 8번째 열까지 작성을 시작한다. 과정을 계속 반복한다. # 포인터가 열포인터의 위치를 설정하기 때문에 # @ 앞에 먼저 지정하는 것이 중요하다.

     

    SAS Program
    data _null_;
       file print n=ps notitles header=hd;
     
       do i = 1 to 80 by 20;
          do j = 1 to ceil(num_students/4);
             set sashelp.class nobs=num_students;
             put #(j+3) @i name $8. '-' +1 weight 5.1;
          end;
       end;
       stop;
     
    hd:
       put @26 'Student Weight in Pounds' / @26 24*'-';
       return;
    run;

     

    프로그램은 다음 출력물을 생성한다.

     

    [OUTPUT 출력결과]

    Results
    Student Weight in Pounds
    ------------------------
     
    Alfred  - 112.5     James   -  83.0     Joyce   -  50.5     Robert  - 128.0
    Alice   -  84.0     Jane    -  84.5     Judy    -  90.0     Ronald  - 133.0
    Barbara -  98.0     Janet   - 112.5     Louise  -  77.0     Thomas  -  85.0
    Carol   - 102.5     Jeffrey -  84.0     Mary    - 112.0     William - 112.0
    Henry   - 102.5     John    -  99.5     Philip  - 150.0

     


     


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

     

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

    댓글