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

【SAS Statement】 INFILE 구문

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

포스팅 목차

    o INFILE 구문

     


    1. 목 적 

       INFILE 구문은 INPUT 구문을 사용하여 읽기 위한 외부 파일을 지정한다. INFILE 구문이 읽을 대상 파일을 인식해야 하므로, 입력 데이터 레코드를 읽는 INPUT 구문 전에 INFILE 구문이 실행되어야 한다. INFILE 구문은 실행문이므로 IF-THEN 구문과 같은 조건 처리 문장과 함께 사용할 수 있다. 

     


    2. 문 법 


    INFILE 
    file-specification <device-type> <options> <operating-environment-options>;

    INFILE DBMS-specifications;

     

    1) File-specification

       외부 파일 또는 내부 데이터로 존재하는 입력 데이터 레코드의 소스를 지정한다. File-specification은 다음 형태가 될 수 있다.

     

    Tip : ERRORCHECK옵션이 STRICT 설정되어 있으면, SYSERR 매크로 변수를 사용하여 file-specification 존재를 확인 있다.

     

    (1) ‘external-file’

         읽기 위한 외부파일의 물리적 이름을 지정한다. 물리적 이름은 운영 환경이 파일에 접근하기 위하여 사용하는 이름이다.

     

    (2) Fileref

         사전에 외부 파일에 할당된 파일참조자를 지정한다. 이전에 FILENAME 구문이나 FILENAME 함수 또는 적당한 운영 환경 명령어를 사용하여서 파일참조자에 외부파일을 지정해야 한다.

     

    필요사항 : 이전에 FILENAME 구문, FILENAME 함수, 적당한 운영 환경 명령어를 사용하여서 파일참조자에 외부파일을 지정해야 한다.
    참고사항 : FILENAME 구문

     

    (3) Fileref(file)

         사전에 외부 파일이 위치하고 있는 병합저장소(윈도우 환경에서 디렉터리)의 위치를 참조하는 파일 참조자를 지정하고, 괄호 안에는 병합저장소 내부에 존재하는 파일 또는 구성원의 이름을 지정하라.

     

    필요사항 : 병합저장소 내부에 위치하거나 유효하지 않은 SAS 이름을 소유한 파일은 인용 부호 안에 작성해야 한다.
    필요사항 : 사전에 FILENAME 구문, FILENAME 함수, 적당한 운영 환경 명령어를 사용하여서 외부파일을 파일참조자(fileref) 지정해야 한다.
    참고사항 : FILENAME 구문
    운영환경정보 : 운영 환경마다 서로 다른 이름(디렉토리, MACLIB, 파티션 데이터 세트 )으로 파일 그룹을 호출한다. 외부 파일을 지정하는 상세한 방법에 대하여는 운영환경에 대한 SAS 도움말을 참조하라.

     

    (4) CARDS | CARDS4 (별칭 : DATALINES | DATALINES4)

         DATALINES를 참조

     

    별칭 : DATALINES | DATALINES4

     

    (5) DATALINES | DATALINES4 (별칭 : CARDS | CARDS4)

         데이터 스텝의 입력 데이터 앞에 DATALINES 또는 DATALIES4 구문을 지정한다. DATALINES 은 INFILE 구문 옵션과 함께 INPUT 구문이 내부 데이터 라인을 읽는 경우에 추가 옵션을 지정하기 위하여 사용할 수 있다.

     

    별칭 : CARDS | CARDS4
    주요기능 : 예제1: 구분자를 처리하는 방법을 변경하기

    2) Device-type

       파일 참조자로 입출력 장치 또는 물리적 파일이 존재하지 않는 위치를 지정하는 경우에 사용되는 장치 유형 또는 접근 방법을 지정한다.

     

    별칭 : DEVICE=
    필요사항 : device-type 물리적 경로 바로 뒤에 존재해야 한다. DEVICE=device-type 문장 어디서나 작성 있다.
    운영환경정보 : 일부 디바이스를 지정 , 추가 지정자가 필요 있다. DISK이외의 값을 지정하기 전에 운영 환경에 대한 SAS도움말을 참조하자. 여기서 리스트 이외의 추가적인 값이 일부 운영 환경에서 사용 있다.

     

    (1) CATALOG :

         카탈로그 접근 방법을 지정. (FILENAME 구문, CATALOG 접근 방법을 참조)

     

    (2) FTP :

         FTP 프로토콜에 존재하는 원격 파일 접근 방법을 지정. (FILENAME 구문, FTP 접근 방법을 참조)

     

    (3) DISK :

         장치 유형으로 디스크 드라이브를 지정. 디스크에 존재하는 파일을 파일참조자로 지정하는 경우에 DISK 옵션이 기본으로 사용된다.

     

    Tip : 디스크에 존재하는 파일에 대하여 파일참조자를 지정하는 경우에 DISK 추가로 지정할 필요는 없다.

     

    (4) DUMMY :

         실제 디바이스 장치에 대한 입출력 작업을 수행하지 않고, 테스트 작업을 수행하는 경우에 사용한다. 디버깅 작업 종료 후 다른 디바이스 유형으로 변경한다.

     

    Tip : DUMMY 디버깅 작업 테스트 작업에 유용하다.

     

    (5) PIPE :

         이름이 지정되지 않은 파이프를 지정한다.

     

    참고 : 일부 운영 환경에서는 지원되지 않는다.

     

    (6) TEMP :

         파일참조자가 지정된 동안에만 존재하는 임시 파일을 생성한다. 임시 파일은 논리적 이름을 통하여 접근 할 수 있고, 논리적 이름이 존재하는 동안에만 사용된다. 이 경우에 물리적 경로를 지정하면 에러가 발생한다.

     

    제한사항 : 물리적 경로명을 지정하면 안된다. 만약 물리적 경로명을 지정하면, SAS 에러를 생성한다.
    Tip : TEMP 디바이스에 의해 처리되는 파일들은 동일한 속성을 가지며, DISK 파일과 동일하게 작동한다.

     

    (7) TERMINAL :

         사용자의 터미널을 지정한다.


    3) 옵션

    (1) BLKSIZE = block-size

         입력 파일의 블록 크기를 지정한다.

     

    기본사항 : 기본 크기는 운영 환경에 따라 다르다.

    운영 환경 정보 : 운영 환경에 대한 SAS도움말 참조.

     

    (2) COLUMN=variable (별칭 : COL=)

         입력 포인터의 현재 열 위치를 저장하기 위한 변수의 이름을 지정한다. 이 변수는 출력 데이터 세트에 자동으로 출력되지 않는다.

     

    별칭 : COL=
    관련사항 : LINE=
    주요기능 : 예제8. 포인터 위치 나열하기

     

    (3) DELIMITER=delimiter(s) (별칭 : DLM=)

         목록(LIST) 입력 방식에서 사용하기 위한 구분자(기본 구분자 공백과 다른)를 지정한다. 기본값은 공백이며, 구분자 지정 방식은 다음과 같다.

     

    • ‘list-of-delimiting-character’

         구분자로 사용하기 위한 하나 이상의 문자를 지정한다.

     

    필요사항 : 인용부호 안에 문자 리스트를 작성하라.
    주요기능 : 예제1: 구분자를 처리하는 방법을 변경하기
    • Character-variable

         변수의 값이 구분자로 사용되는 문자 변수를 지정한다.

    별칭 : DLM
    기본값 : 공백
    Tip : 구분자는 대소문자를 구분한다.
    참고 : 구분자를 사용하여 구분된 데이터 읽기.
    관련사항 : DLMSTR=, DSD (delimiter-sensitive data)
    주요기능 : 예제1: 구분자를 처리하는 방법을 변경하기

     

     

    (4) DLMSTR=delimiter

         목록 입력을 위하여 사용하기 위한 구분자로 문자열을 지정한다. 기본값은 공백이다.

     

    • delimiting-string’

         구분자로 사용하기 위한 문자열을 지정한다.

     

    필요사항 : 문자열을 인용부호 안에 작성해야 한다.
    주요기능 : 예제1: 구분자를 처리하는 방법을 변경하기
    • Character-variable

         변수의 값이 구분자가 되는 문자열을 지정한다.

     

    기본값 : 공백
    영향 : INFILE 구문에 다수의 DLMSTR=옵션을 지정하면, 마지막에 지정된 DLMSTR=옵션이 적용될 것이다. DELIMITER= DLMSTR=옵션이 함께 지정되면, 마지막에 지정된 옵션이 적용 것이다.
    영향 : RECFM=N 지정하면, 가장 입력 항목을 유지하기 위하여 충분히 LRECL 지정해야 한다. 그렇지 않으면, 레코드가 LRECL에서 지정된 길이로 구분 가능성이 있다.
    Tip : 구분자는 대소문자를 구분한다. 구분자로 사용되는 문자열에서 대소문자가 구분되지 않도록 하기 위하여, DLMSOPT=’I’ 옵션을 사용하라.
    관련사항 : DELIMITER=, DLMSOPT=, DSD
    주요기능 : 예제1: 구분자를 처리하는 방법을 변경하기

     

    (5) DLMSOPT = ‘option(s)’

         DLMSTR=옵션에서 지정한 문자열에 대한 처리 옵션을 지정하라.

     

    필요사항 : DLMSOPT= 옵션은 DLMSTR=옵션과 함께 사용되는 경우에만 적용된다.
    관련사항 : DLMSTR=
    주요기능 : 예제1: 구분자를 처리하는 방법을 변경하기

     

    • I : 구분자로 사용되는 문자열에서 대소문자가 구분 되지 않도록 지정.
    • T : 지정한 문자열 구분자의 후행 공백을 제거하도록 지정
    Tip : T옵션은 구분자 열로 변수를 사용하는 경우에 유용하다.
    Tip : I,T 또는 양쪽을 함께 지정 있다.

     

    (6) DSD(delimiter-sensitive data)

         데이터값이 인용부호 안에 위치한 경우에, 데이터 값 안에 존재하는 구분자를 문자 데이터로 취급되도록 지정한다. DSD옵션은 목록(LIST) 입력 방식을 사용하는 경우에 SAS가 구분자를 취급하는 방식을 변경하고, 기본 구분자로 콤마를 설정한다. 쉼표 이외의 구분자를 사용하기 위하여 DELIMITER= 또는 DLMSTR=을 지정하라. DSD옵션을 지정하면, 2개의 연속적인 구분자 사이를 결측값으로 취급하고, 데이터값에서 인용 부호를 제거한다. 만약 인용 부호를 유지하려면, tilde(~) 출력형식 수정자를 사용하라.

     

    영향 : 구분자를 변경하기 위하여 DELIMITER= 또는 DLMSTR=옵션을 사용하라.
    Tip : 인용부호 안에 위치한 구분자를 포함하는 문자열을 읽기 위하여 DSD옵션과 목록 입력 방식을 사용하라. INPUT 구문은 인용부호 내의 구분자를 유효한 문자로 취급하고, 값이 저장되기 전에 문자열에서 인용 부호를 제거한다. 인용 부호를 유지하기 위하여 tilde(~) 출력형식 수정자를 사용하라.
    참고 : 구분자를 사용하여 구분된 데이터 읽기.
    관련사항 : DELIMITER=, DLMSTR=
    주요기능 : 예제1: 구분자를 처리하는 방법을 변경하기
    예제2: 목록 입력 사용하는 경우에 결측치 값과 짧은 레코드 처리하기

     

    (7) ENCODING=’encoding-value’

         외부파일에서 데이터를 읽는 경우에 사용되는 인코딩을 지정하라.

     

    기본사항 : SAS 기본적으로 외부 파일이 세션 인코딩과 동일한 인코딩으로 존재한다고 가정한다.
    주요기능 : 예제11. 외부 파일에 대한 인코딩 지정하기

     

    (8) END=variable

         입력 파일에서 현재 입력 데이터의 레코드가 마지막 레코드인 경우에 지정된 변수의 값을 1로 지정한다. 마지막 데이터 레코드를 처리하기 전까지 END= 변수의 값은 0으로 설정된다.

     

    제한사항 : 다음에서는 END=옵션을 사용 없다.

    -         UNBUFFERED 옵션
    -         DATALINES 또는 DATALINES4 구문
    -         다중 입력 데이터 레코드를 읽는 INPUT 구문
    Tip : END= 옵션이 유효하지 않는 경우에 EOF=옵션을 사용하라.
    주요기능 : 예제5. 다중 입력 파일 읽기

     

    (9) EOF=label

         INFILE 구문이 파일의 끝 부분을 읽는 경우에 암묵적인 GO TO 구문의 목적지가 되는 구문 라벨을 지정한다. INPUT 구문이 더 이상 읽을 레코드가 없는 파일에서 추가로 읽기 위한 시도를 하는 경우에, 표시된 구문 라벨로 프로그램 실행을 이동한다.

     

    영향 : 다음 경우에 END=옵션 대신에 EOF=옵션을 사용하라.

    -         UNBUFFERED 옵션
    -         DATALINES 또는 DATALINES4 구문
    -         다중 입력 데이터 레코드를 읽는 INPUT 구문
    Tip : 다중 입력 파일에서 순차적으로 읽는 경우에 EOF=옵션이 유용하다.
    관련사항 : END=, EOV=, UNBUFFERED

     

    (10) EOV=variable

         연속적으로 파일 읽기 작업을 수행한다면, 다수의 파일을 연속적으로 읽는 경우에, 파일의 첫 번째 레코드를 읽는 경우에 지정된 변수의 값을 1로 지정한다. 

     

    Tip : 데이터 세트의 개별 경계에서 값이 설정된 이후에 다시 0으로 재설정된다.
    관련사항 : END=, EOF=

     

    (11) EXPANDTABS | NOEXPANDTABS

         TAB 문자를 표준 TAB 설정으로 변경하여 처리할지 여부를 지정하는데, 표준 TAB은 TAB 문자를 8개 열로 구성된 공백으로 변경하여서 처리한다. EXPANDTABS 옵션은 구분자가 TAB으로 설정되어 있는 데이터를 읽는 경우에 유용하다. 기본값은 NOEXPANDTABS 이다.

     

    기본값 : NOEXPANDTABS
    Tip : 운영 환경에서 TAB문자를 포함하는 데이터를 읽는 경우에 EXPANDTABS 유용하다.
    Tip : EXPANDTABS옵션은 구분자가 TAB으로 설정되어 있는 경우 유용하다. 그러나, 데이터에 TAB 문자와 8개의 연속된 공백이 함께 존재하는 경우에는 표준 TAB구분자와 구별이 어려워서 문제가 발생 있다.

     

    (12) FILENAME=variable

         현재 처리 중인 입력 파일의 물리적 이름을 관측치로 저장하기 위한 변수를 지정한다. 이 변수는 출력 데이터 세트에 작성되지 않는다. 변수의 길이는 LENGTH 구문으로 설정할 수 있다.

     

    Tip : LENGTH 구문을 사용하여 파일 이름을 포함 있도록 변수의 길이를 충분하게 설정하라.
    관련사항 : FILEVAR=
    주요기능 : 예제5. 다중 입력 파일 읽기

     

    (13) FILEVAR=variable

         INFILE 구문이 현재 읽고 있는 입력 파일을 닫고, 동일한 INFILE 구문에서 새로운 파일을 추가로 읽기 위하여 신규 파일의 위치를 관측치 값으로 포함하고 있는 변수를 지정한다. 이 변수의 값은 물리적 파일 이름으로 구성되며, 다음 차례의 INPUT 구문이 실행되면 FILEVAR= 변수의 관측치 값이 가리키는 새로운 파일을 연속적으로 자동 처리할 수 있다. FILEVAR= 옵션은 파일을 읽고, 해당 파일을 닫은 후에 다음 파일을 자동으로 열 수 있다. 이 값은 출력 데이터 세트에 출력되지 않는다. 

     

         FILEVAR=옵션을 사용하면 file-specification은 실제 파일 이름이나 사전에 파일에 할당된 파일참조자 역할 대신에 위치표시자의 역할을 수행한다. 위치표시자를 사용하여서 SAS 로그에 작업 정보를 기록한다. 다만, 프로그램 규칙은 파일참조자와 동일한 규칙을 따른다.

     

    제한사항 : FILEVAR=변수는 물리적 파일 이름을 관측값으로 소유한다.
    영향 : FILEVAR=옵션을 사용하는 경우에, file-specification 이전에 파일에 할당된 실제 파일 이름 또는 파일참조자가 아니라 단지 위치표시자의 역할을 수행한다. SAS로그에 작업 정보를 기록하기 위하여 위치표시자를 사용한다. 그러나, 파일참조자와 동일한 규칙을 따른다.
    Tip : 동적으로 현재 열려진 입력 파일을 새로운 물리적 파일로 변경하기 위하여 FILEVAR= 옵션을 사용하라.
    관련사항 : 제자리에서 외부 파일 갱신하기
    주요기능 : 예제5. 다중 입력 파일 읽기

     

    (14) FIRSTOBS=record-number

         입력 파일에서 입력 데이터 레코드를 읽기 시작하기 위한 레코드의 번호를 지정한다. FIRSTOBS=와 OBS= 옵션을 함께 사용하여서 파일의 중간에 위치한 데이터를 읽을 수 있다. 기본값은 1이다.

     

    기본값 : 1
    Tip : 파일의 중간 부분에서 레코드의 일정 범위를 읽기 위하여 FIRSTOBS= OBS= 옵션을 함께 사용하라.
    예제 : 50~100번째 레코드를 읽는다.
    infile file-specification firstobs=50 obs=100;

     

    (15) FLOWOVER

         INPUT 구문에 지정된 모든 변수에 대한 값을 현재 처리 중인 입력 행에서 발견하지 못하는 경우에 INPUT 구문이 다음 행에 위치한 입력 데이터를 계속해서 읽도록 지정한다. 다음 행에서 나머지 변수의 값을 읽은 후에 해당 행의 나머지 값들은 더 이상 처리하지 않고 다음 행으로 이동한다. FLOWOVER는 INPUT 구문의 기본 작업 방식이다.

     

    참조 : 라인의 끝을 경유하여 읽기
    관련사항 : MISSOVER, STOPOVER, TRUNCOVER

     

    (16) LENGTH=variable

         현재 입력 행의 길이를 관측치 값으로 저장하기 위한 변수를 지정한다. INPUT 구문이 실행되기 전까지 해당 변수에 값을 할당하지 않는다. LENGTH= 옵션의 변수는 출력데이터 세트에 작성되지 않는다.

     

    Tip : 필드의 길이가 다양한 경우에, 옵션과 $VARYING 입력형식을 함께 사용하면 유용하다.
    주요기능 : 예제4: 가변 길이 레코드를 포함하는 파일 읽기
    예제7. 복사된 레코드 절단하기

     

    (17) LINE=variable

         입력 버퍼에서 입력 포인터가 처리 중인 행의 위치를 관측치 값으로 저장하기 위한 변수를 지정한다. LINE=변수는 출력 데이터 세트에 작성되지 않는다. LINE= 변수의 값은 INPUT 구문에서 N=옵션 또는 #n 행 포인터 조절자에 의하여 지정된 행 그룹 내에서 현재 커서가 위치한 그룹 내의 상대적인 행 번호를 저장한다.

     

    범위 : 1~ N옵션의 값까지
    영향 : INPUT 구문에서 N=옵션 또는 #n 포인터 조절자에 의하여 지정된 라인 그룹 내에서, 현재 커서가 위치하는 곳의 상대적 라인 번호를 LINE= 변수의 값으로 저장한다.
    관련사항 : COLUMN=, N=
    주요기능 : 예제8. 포인터 위치 나열하기

     

    (18) LINESIZE=line-size (별칭 : LS=)

         INPUT 구문에서 사용되는 레코드 길이를 지정한다. INPUT 구문이 LINESIZE= 옵션에서 지정된 열을 초과하여 읽는 경우에 수행되는 작업은 FLOWOVER, MISSOVER, SCANOVER, STOPOVER, TRUNCOVER 옵션 중에서 현재 적용된 옵션에 따라서 그 결과가 달라지는데, 기본적으로 FLOWOVER 옵션이 설정되어 있다. 전체 레코드를 읽을 필요가 없는 경우에 읽기 위한 행의 길이를 제한할 수 있다.

     

    운영환경정보 : line-size 값은 운영 환경 레코드 크기에 따라 달라진다.
    별칭 : LS=
    범위 : 최대 32767까지이다.
    영향 : 만약 INPUT 구문이 LINESIZE=옵션에 의하여 지정된 열을 경유하여 읽는 경우에 수행되는 작업은 FLOWOVER, MISSOVER, SCANOVER, STOPOVER, TRUNCOVER 옵션 중에서 현재 적용된 옵션에 따라서 결과가 달라진다. FLOWOVER 옵션이 기본작업.
    Tip : 전체 레코드를 읽는 것을 원하지 않는 경우에 읽는 레코드 길이를 제한하기 위하여 LINESIZE=옵션을 사용하라.
    예제 데이터가 73~80열에 분석에 필요 없는 순차 번호를 포함하고 있으면, 처음부터 72열까지만 INPUT 구문으로 읽기 위하여 INFILE 구문에서 LINESIZE=옵션을 지정하라.
    infile file-specification linesize=72;

     

    (19) LRECL=logical-record-length

         논리 레코드 길이를 지정한다. File-specification에 DATALINES을 지정한 경우에 LRECL 옵션은 사용할 수 없다. 대안으로 LRECL=시스템 옵션을 사용하여서 전역 논리 레코드 길이를 지정할 수 있다. LRECL=은 파일의 논리적 행 길이를 지정하고, LINESIZE=는 INPUT 구문이 처리하기 위한 행의 길이를 지정한다.

     

    운영환경정보 : logical-record-length 대한 값은 운영 환경에 따라 달라진다.
    기본사항 : 운영 환경의 파일 특성에 따라 달라진다.
    제한사항 : LRECL DATALINES 파일 지정자를 사용하는 경우에는 유효하지 않는다.
    영향 : 대안으로 LRECL=시스템 옵션을 사용하여서 전역 논리 레코드 길이를 지정 있다.
    Tip : LRECL= 파일의 논리적 라인 길이를 지정하고, LINESIZE= INPUT 구문이 얼마나 많은 라인을 읽을지 지정한다.

     

    (20) MISSOVER

         INPUT 구문에 지정된 모든 변수에 대한 값을 현재 입력 행에서 모두 발견하지 못하는 경우에, INPUT 구문이 다음 행에 위치한 입력 데이터 레코드에서 데이터 읽는 것을 방지한다. INPUT 구문이 현재 입력 데이터 레코드의 끝에서 해당 변수에 대응되는 값을 찾지 못하면, 그 변수의 값은 결측치로 처리하도록 한다.

    Tip : 만약 마지막 필드 또는 필드 중간에 결측값이 존재하고, 해당 변수에 결측치 값을 할당하기 원하는 경우에는 MISSOVER 옵션을 사용하라.
    참고 : 라인의 끝을 경유하여 읽기
    관련사항 : FLOWOVER, SCANOVER, STOPOVER, TRUNCOVER
    주요기능 : 예제2: 목록 입력 사용하는 경우에 결측치 값과 짧은 레코드 처리하기

     

     

    (21) N=available-lines

         입력 포인터가 한 번의 이동 과정에서 움직일 수 있는 행의 개수를 지정한다. 다수의 # 포인터가 지정된 # 포인터 중에서 가장 최상위 값이 사용되고, # 포인터 조절자를 지정하지 않은 경우에 기본값은 1이 된다. 이 옵션은 포인터가 한 번에 접근할 수 있는 라인의 개수를 지정하지만, INPUT 구문이 읽기 위한 행의 개수에는 영향을 미치지 않는다. INPUT 구문에서 # 포인터 조절자에 지정된 값이 N의 값보다 적은  경우에는 기대하지 않는 결과가 발생할 수 있는데, 예기하지 않은 결과를 방지하기 위해서 N=옵션의 값과 동일한 # 포인터 조절자를 사용하라. 

     

    기본사항 : # 포인터 뒤의 가장 최상위 값이 데이터 스텝에서 INPUT 구문을 제어한다. # 포인터 조절자를 생략하면 기본 값은 1 된다.
    영향 : 옵션은 단지 포인터가 번에 접근 있는 라인의 개수에 영향을 미친다. INPUT 구문이 읽기 위한 라인의 개수에는 영향을 미치지 않는다.
    Tip : INPUT 구문에서 N 값보다 적은 # 포인터 조절자를 사용하는 경우에는 기대하지 않는 결과가 산출 있다. 예기하지 않은 결과를 방지하기 위해서 N=옵션의 값과 동일한 # 포인터 조절자를 사용하라. 다음은 예제이다.

    infile 'external
    file' n=5;
    input #2 name : $25. #3 job : $25. #5;

    비록 데이터가 레코드를 읽지 않아도 INPUT 구문에 #5 포인터 조절자를 프로그램에 포함하라.
    주요기능 : 예제8. 포인터 위치 나열하기

     

    (22) NBYTE=variable

         스트림 레코드 형식(Stream-record format)으로 데이터를 읽는 경우에 파일에서 읽을 바이트 수를 저장하고 있는 변수를 지정한다. (FILENAME 구문에서 RECFM=S로 설정되어 있는 경우)

     

    기본값 : 파일의 LRECL
    영향 : 읽기 위한 바이트의 수를 -1 설정하였다면, FTP SOCKET 접근 방법은 입력 버퍼에서 현재 사용하는 바이트의 수를 반환한다.
    참고 : FILENAME 구문에서 RECFM= 참고

     

    (23) OBS=record-number | MAX

         입력 파일에서 마지막으로 읽을 행의 번호를 지정한다. FIRSTOBS=와 OBS= 옵션을 함께 사용하여서 파일의 중간에 위치한 데이터를 읽을 수 있다. 기본값은 MAX 이다.

    • Record-number : 

         데이터를 순차적으로 읽는 경우에 입력 파일에서 마지막으로 읽을 행의 번호를 지정한다.

    • MAX : 

         처리를 할 수 있는 관측치의 최상위 번호를 자동으로 지정한다

     

    기본값 : MAX
    Tip : 파일 중간 부분에서 레코드의 일정 범위를 읽기 위하여 FIRSTOBS OBS= 사용하라.
    예제 : 다음 문장은 파일에서 처음 100 레코드만 처리한다.

    infile file-specification obs=100;

     

    (24) PAD | NOPAD

         LRECL=옵션에 지정된 길이(length)보다 외부 파일에서 읽은 레코드의 길이가 짧은 경우에 부족한 부분을 공백을 사용하여 채울지 여부를 지정한다. 기본값은 NOPAD 이다.

     

    기본값 : NOPAD
    예제 : LRECL=

     

    (25) PRINT | NOPRINT

         입력 파일에 존재하는 카드 제어 문자 처리 방식을 지정한다. 데이터 스텝에서 카드 제어(Carriage-control) 문자를 적용하여 파일을 읽기 위해서는 PRINT 옵션을 지정해야 하고, 카드 제어 문자를 데이터값으로 읽기 위해서는 NOPRINT 옵션을 사용하라.

     

    Tip : 데이터 스텝에서 카드 제어(Carriage-control) 문자를 적용하여 파일을 읽기 위하여 PRINT옵션을 지정하라. 카드 제어 문자를 데이터 값으로 읽기 위하여 NOPRINT옵션을 사용하라.

     

    (26) RECFM=record-format

         입력 파일의 레코드 형식(Record format)을 지정한다.

     

    운영환경정보 : 레코드 형식의 값은 운영 환경에 따라 달라진다. 상세한 내용은 운영환경에 대한 도움말을 참조하라.

     

    (27) SCANOVER

         INPUT 구문의 포인터가 @’character-string’ 표현에서 지정한 문자열을 발견할 때까지 입력 데이터 레코드를 계속 검색하도록 한다. MISSOVER, TRUNCOVER, STOPOVER 옵션은 @’character-string’ 표현을 검색하는 중에 레코드의 끝에 도착했을 때에 INPUT 구문의 작업 처리 방식을 결정한다. 위의 옵션들은 검색 작업을 중지하도록 처리하지만, 기본 옵션 FLOWOVER은 INPUT 구문이 검색을 중지할 때까지 다음 레코드를 계속해서 검색하도록 한다.

     

    영향 : MISSOVER, TRUNCOVER, STOPOVER 옵션은 @’character-string’ 표현을 검색하는 중에 레코드의 끝에 도착 했을 때에 INPUT 구문의 작업 처리 방식을 변경한다. 위의 옵션들은 검색을 중지하도록 하는 반면에 기본 옵션 FLOWOVER INPUT 구문이 다음 레코드에서 계속해서 검색하도록 한다.
    Tip : SCANOVER FLOWOVER 동시에 지정 필요는 없다.
    참고 : 라인의 끝을 경유하여 읽기
    관련사항 : FLOWOVER, SCANOVER, STOPOVER, TRUNCOVER
    주요기능 : 예제3 : 지정한 문자열에서 가변 길이 레코드 검색하기

     

    (28) SHAREBUFFERS (별칭 : SHAREBUFS)

         FILE 구문과 INFILE 구문이 동일한 버퍼를 사용하도록 지정한다. INFILE 구문에서 SHAREBUFFERS 옵션을 지정하고 FILE과 PUT 구문을 함께 사용하면, 외부 파일의 위치를 변경하지 않고 제 자리에서 업데이트할 수 있다. 외부 파일에 바로 업데이트 작업을 수행하면 PUT 구문의 결과가 출력 버퍼를 경유하지 않고, 입력 버퍼에서 파일에 직접 작성되기 때문에 CPU 시간을 절약해 준다.

     

    경고 : 특정한 길이의 레코드를 읽어서 상이한 길이의 레코드를 업데이트 하는 경우, SHAREBUFFERS, RECFM=V, _INFILE_ 옵션의 사용에 신중하라.

    _INFILE_ 길이가 수정되어서 레코드 길이 자체가 변경 있다. 잠재적인 문제를 피하기 위한 한가지 방법은 _INFILE_ 공백으로 채우거나 길이를 잘라서 원래 레코드 길이와 동일하게 유지하는 것이다.
    별칭 : SHAREBUFS
    Tip : 외부파일을 위치 변경없이 자리에서 업데이트하기 위해서 INFILE, FILE, PUT 구문과 SHAREBUFFERS옵션을 사용하라. 자리에 있는 외부 파일을 바로 업데이트 하는 방식은 PUT 구문의 출력이 입력버퍼에서 출력 버퍼를 경유하여 작성되지 않고, 입력 버퍼에서 바로 파일에 작성되기 때문에 CPU 시간을 절약해 준다.
    Tip : 전체 레코드 대신에 외부 파일에서 지정한 일부 필드를 업데이트하기 위하여 SHAREBUFFERS옵션을 사용하라.
    주요기능 : 예제6. 외부 파일 갱신

     

    (29) START=variable

         PUT _INFILE_ 구문이 작성되는 레코드의 첫 번째 열 번호를 저장하고 있는 변수를 지정한다. 이 변수는 데이터 세트에 작성되지 않는다.

     

    관련사항 : PUT 구문의 _INFILE_ 옵션

     

    (30) STOPOVER

         INPUT 구문에 지정된 모든 변수에 대응하는 데이터 값을 현재 입력 라인에서 발견하지 못하고 현재 레코드의 끝에 도착하면 데이터 스텝 처리를 중지시킨다. 입력 라인이 예상한 데이터 행의 개수를 모두 포함하지 않은 경우에, STOP 구문을 실행한 것과 유사하게 _ERROR_을 1로 설정한 후에 데이터 세트 생성을 중지하고, 불완전한 데이터 라인을 출력한다. 기본 작업으로 재설정하기 위하여 FLOWOVER 옵션을 지정하라.

     

    Tip : 기본 작업으로 재설정하기 위하여 FLOWOVER 옵션을 사용하라.
    참고사항 : 라인의 끝을 경유하여 읽기
    관련사항 : FLOWOVER, SCANOVER, STOPOVER, TRUNCOVER
    주요기능 : 예제2: 목록 입력 사용하는 경우에 결측치 값과 짧은 레코드 처리하기

     

    (31) TRUNCOVER

         일반적으로 입력 데이터 레코드의 길이가 INPUT 구문에서 지정된 길이보다 짧은 경우에 INPUT 구문의 기본 데이터 처리 작업을 제어한다. 기본적으로 INPUT 구문은 자동으로 다음 입력 데이터 레코드를 읽지만(Flowover), TRUNCOVER는 일부 레코드가 INPUT 구문이 예상한 길이보다 짧을 경우에, 가변 길이(variable-length) 레코드를 읽을 수 있도록 한다. 값이 할당되지 않은 변수의 값은 결측치로 설정된다. 

    필드의 길이가 지정한 길이보다 짧은 경우에 사전에 입력 버퍼에 읽은 값만을 변수에 할당하는 경우에 유용한다.

     

    Tip : 필드가 예정된 길이보다 짧은 경우에 입력 버퍼의 항목을 그대로 변수에 할당하기 위하여 TRUNCOVER 사용하라.
    참고 : 라인의 끝을 경유하여 읽기
    관련사항 : FLOWOVER, SCANOVER, STOPOVER, TRUNCOVER
    주요기능 : 예제3 : 지정한 문자열에서 가변 길이 레코드 검색하기

     

    (32) UNBUFFERED (별칭 : UNBUF)

         데이터에 대하여 버퍼로 미리 읽기(Buffered read, look ahead) 작업을 수행하지 않도록 한다. DATALINES 구문을 사용하여 내부 데이터를 읽는 경우에 UNBUFFERED 옵션이 적용된다.

     

    별칭 : UNBUF
    영향 : UNBUFFERED 옵션을 사용하는 경우에는 END=변수는 1 설정하지 못한다.
    Tip : DATALINES 구문을 사용하여 내부 데이터를 읽는 경우에 UNBUFFERED 옵션이 적용된다.

     

    (33) INFILE=variable

         INFILE 구문을 사용하여 현재 처리하고 있는 입력 버퍼의 내용을 할당하기 위한 문자 변수를 지정한다. 이 변수는 일반 변수들과 동일한 작업을 수행하는데, 이 변수에 직접 값을 할당할 수도 있다. 이 변수를 수정하면 INFILE 구문에 대한 현재 입력 버퍼가 직접 수정되며, 버퍼 수정한 후에 PUT _INFILE_ 구문을 사용하면 수정된 버퍼의 내용을 반영하여 처리한다.

         이전에 정의된 변수를 사용할 수 없으며, LENGTH 또는 ATTRIB 구문을 사용하여 _INFILE_=변수의 길이를 설정하거나 변경할 수 없다. 그러나 ATTRIB구문 또는 FORMAT 구문을 사용하여 출력 형식을 지정할 수 있다.

         자동 변수와 동일하게 _INFILE_= 변수는 데이터 세트에 출력되지 않으며, _INFILE_= 옵션을 사용하지 않고 다른 구문에서 입력 버퍼의 내용에 접근하기 위하여 자동 변수 _INFILE_을 사용할 수 있다. 

     

    제한사항 : 이전에 정의된 변수를 사용 없다. _INFILE_= 지정자가 데이터 스텝에서 변수를 처음 사용하는지 확인하라. LENGTH 또는 ATTRIB 구문을 사용하여 _INFILE_=변수의 길이를 설정하거나 변경하면 안된다. 그러나, ATTRIB또는 FORMAT 구문을 사용하여 출력 형식을 지정 있다.
    영향 : 문자 변수의 최대 길이는 지정된 INFILE 구문의 논리 레코드 길이(LRECL=)이다. 그러나, 프로그램이 실행되기 전까지 LRECL= 없으므로, 프로그램이 컴파일되는 동안에는 변수의 길이로 32,767 사용한다.
    Tip : 변수를 수정하면 INFILE 구문에 대한 현재 입력 버퍼가 직접 수정된다. 버퍼 수정 후에 PUT _INFILE_ 구문을 사용하면 수정된 버퍼의 내용을 반영하여 처리한다. _INFILE_= 변수는 다수의 버퍼를 지정하기 위하여 N=옵션을 사용하여도 지정된 INFILE 구문의 현재 입력 버퍼에만 접근을 한다.
    Tip : _INFILE_= 옵션을 사용하지 않고 다른 구문에서 입력 버퍼의 항목을 접근하기 위하여 자동 변수 _INFILE_ 사용하라.
    Tip : _INFILE_ 변수는 고정된 길이로 정의되지 않는다. _INFILE_ 변수에 값을 할당하는 경우에 변수의 길이는 할당되는 값의 길이로 변경된다.
    주요논의 : 입력 버퍼의 내용 접근하기
    주요기능 : 예제9. 입력 버퍼에서 데이터 작업하기
    예제10. 다중 파일을 입력 파일로 접근하기

     


    3. 범 주

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

     


    4. 상세 설명

     

    INFILE 구문 사용 방법

    INFILE 구문이 읽을 대상 파일을 인식해야 하기 때문에, 입력 데이터 레코드를 읽는 INPUT 구문 전에 INFILE 구문이 실행되어야 한다. INFILE 구문은 실행문이므로 IF-THEN 구문과 같은 조건 처리 문장에서 사용 있다. INFILE 구문에서 입력 데이터 레코드의 소스를 관리 있다.

     

    일반적으로, 외부파일의 데이터를 읽기 위하여 INFILE 구문을 사용하라. 내부 데이터를 읽는 경우에 DATALINES 구문을 사용해야 한다. 그러나, INFILE 구문에서만 사용되는 특정 데이터 읽기 옵션의 이점을 취하기 위하여 동일 DATA 스텝에서 파일지정자(file-specification) DATALINES 지정한 INFILE 구문과 DATALINES 구문을 함께 사용 있다. 상세한 정보는 아래의 “레코드의 길이가 내부 데이터 레코드 읽기”를 참조.

     

    동일 파일 지정자에 대하여 다수의 INFILE 구문을 지정하고, 개별 INFILE 구문에서 옵션을 지정한 경우에 옵션 효과가 추가되어 적용된다. 그러나, 되도록 혼동을 피하기 위하여 주어진 외부 파일에 대한 번째 INFILE 구문에 모든 옵션을 적용하라.

     

    다중 입력 파일 읽기

    아래의 가지 방법 중에 하나의 방법으로 데이터 스텝의 단일 반복에서 다중 입력 파일을 읽을 있다.

     

    • 다수의 파일을 열어서 유지한 상태에서 읽을 파일을 변경하기 위하여, 다중 INFILE 구문을 사용하라. (예제5 참조)

     

    • 단일 데이터 스텝에서 현재 입력 파일을 동적으로 변경하기 위하여 INFILE 구문에서 FILEVAR=옵션을 사용하라. FILEVAR= 옵션은 파일을 읽고, 해당 파일을 닫은 후에 다음 파일을 자동으로 열 수 있다. (예제5 참조)

     

    제자리에서 외부 파일 갱신하기

    외부 파일의 레코드를 갱신하기 위하여 FILE 구문과 INFILE 구문을 함께 사용 있다.

     

    1.   FILE 구문 전에 INFILE 구문을 지정하라.

    2.   FILE 구문과 INFILE 구문에 동일한 파일참조자(Fileref) 또는 물리적 파일이름을 지정하라.

    3.   FILE 구문 대신 INFILE 구문에 INFILE 구문과 FILE 구문 양쪽에서 공통으로 적용되는 옵션을 작성하라. (FILE 구문에 작성되는 옵션은 적용되지 않는다.)

     

    예제6. 외부 파일 갱신 참조

     

    전체 레코드 대신 레코드의 일부 필드를 업데이트하기 위하여 SHAREBUFFERS 옵션을 참조하라.

     

    입력 버퍼의 내용 접근하기

    _INFILE_= 변수와 더불어 INFILE 구문에서 가장 최근 실행되는 현재 입력 버퍼의 내용을 참조하기 위하여 자동 _INFILE_ 변수를 사용 있다. 변수는 자동으로 유지(Retain) 되고 결측값으로 초기화된다. 다른 자동 변수처럼 _INFILE_ 데이터 세트에 작성되지 않는다.

     

    INFILE 구문에서 _INFILE_=옵션을 지정하는 경우에 변수는 자동 _INFILE_변수에 의해 간접적으로 참조된다. 자동 _INFILE_ 변수가 사용되면, INFILE 구문에 대한 내부 _INFILE_= 변수를 생성한다. 자동변수 _INFILE_ 사용하지 않으면, SAS 특정 파일에 대하여 내부 변수 _INFILE_ 생성하지 않는다.

     

    실행하는 동안과 참조 시점에, 문자 변수의 최대 길이는 현재 _INFILE_= 변수의 최대 길이가 할당된다. 그러나, _INFILE_ 구문은 실행 구문 전까지 길이가 알려지지 않은 변수를 참조하기 때문에 컴파일 구문 동안에 할당되는 길이는 32,767이다. 예를 들어, 만약 길이가 정의되지 않은 새로운 변수에 _INFILE_ 할당하면, 새로운 변수의 기본 길이는 32,767이다. _INFILE_ 길이를 설정 또는 제어하기 위하여 LENGTH 구문과 ATTRIB 구문을 사용 없다. _INFILE_ 출력형식을 지정하기 위하여 FORMAT 구문과 ATTRIB 구문은 사용 있다.

     

    다른 SAS변수처럼 할당문에서 _INFILE_변수를 갱신 있고, PUT 구문에서 _INFILE_ 함께 출력형식을 사용 있다. 예를 들어, 다음 PUT 구문은 16진수 출력형식을 사용하여 입력 버퍼의 내용을 작성한다.

    PUT _INFILE_ $hex100.;

     

    _INFILE_ 수정은 간접적으로 INFILE 구문의 현재 입력 버퍼를 수정한다. 버퍼 수정 뒤에 PUT _INFILE_ 구문을 실행하면 수정된 버퍼의 내용이 반영 것이다.

     

    비록 다중 버퍼를 지정하기 위하여 N=옵션을 사용 경우에도 _INFILE_ 단지 INFILE 구문에 대한 현재 입력 버퍼의 내용만을 접근한다. 모든 N= 버퍼를 접근하기 위해서, 현재 입력 버퍼를 접근이 필요한 버퍼로 이동시키기 위하여 INPUT 구문과 # 포인터 조절자를 함께 사용하여 지정해야 한다.

     

    구분자를 사용하여 구분된 데이터 읽기.

    목록(List) 입력 방식으로 입력 데이터 레코드를 읽기 위하여 사용되는 기본 구분자는 공백이다. Delimiter-sensitive data(DSD) 옵션, DELIMITER= 옵션, DLMSTR= 옵션, DLMSOPT= 옵션은 목록 입력이 구분자를 처리하는 방법에 영향을 준다. DELEIMITER= 또는 DLMSTR= 옵션은 INPUT 구문이 목록 입력으로 읽을 데이터 값에 대한 구분자로 공백과 다른 문자를 사용하도록 지정한다. DSD옵션이 적용 경우에 INPUT 구문은 기본 구분자로 콤마를 사용한다.

     

    개의 연속적인 구분자 사이에 대하여 결측치로 값을 할당하기 위하여 DSD옵션을 사용하라. 기본적으로 INPUT 구문은 연속된 구분자를 하나의 단위로 취급하지만, DSD옵션을 사용하는 경우에 INPUT 구문은 연속된 구분자를 개별적으로 처리한다. 그러므로, 연속된 구분자 사이를 결측치 값으로 처리한다. 콤마 구분자를 대신하여 다른 값으로 구분자를 변경하기 위하여 DELIMITER= 또는 DLMSTR= 옵션을 사용하라.

     

    예를 들어, 다음 데이터 스텝 프로그램은 콤마로 분리된 데이터를 읽기 위하여 목록 입력을 사용한다. 번째 데이터 라인은 결측치 값을 포함하고 있다. SAS 목록입력에서 연속된 구분자의 사용을 허용하기 때문에 INPUT 구문은 결측치 값을 감지 없다.

     

    SAS Statements
    data scores;
       infile datalines delimiter=',';
       input test1 test2 test3;
       datalines;
    91,87,95
    97,,92
    ,1,1
    ;

     

    FLOWOVER 옵션 적용 시에 SCORES데이터 세트는 2개의 관측치로 생성된다. 그러나, 번째 관측치는 부정확하게 구축된다.

    OBS TEST1 TEST2 TEST3
    1 91 87 95
    2 97 92 1

     

    문제를 해결하기 위하여 INFILE 구문에 DSD 옵션을 사용하라.

     

    SAS Statements
    infile datalines dsd;

     

    INPUT 구문은 개의 연속된 구분자를 감지하고, 번째 관측치의 TEST2변수에 결측값을 할당한다.

    OBS TEST1 TEST2 TEST3
    1 91 87 95
    2 97 . 92
    3 . 1 1

     

    DSD옵션은 또한 인용 부호 안에 구분자를 포함하는 문자값을 목록 입력을 사용하여 읽을 있도록 한다. 예를 들어, 데이터가 콤마로 구분되어 있는 경우에, DSD옵션은 인용부호 안에 문자열이 배치될 있도록 하고, 인용부호 안에 위치한 콤마를 유효한 문자로 (구분자가 아닌) 읽는다. 그러나, 인용 부호를 문자값의 일부로 함께 저장하지 않는다. 인용부호를 값의 일부로 읽기 위하여 INPUT 구문에서 tilde(~) 출력형식 수정자를 사용하라.

     

    참고 : 텍스트 파일이 로컬 인코딩 환경과 다른 곳에 위치한 경우에 EBCDICD 또는 ASCII 환경에서 ENCODING=옵션이 필요 있다.

     

    예를 들어, ASCII 플랫폼에서 EBCDIC 텍스트 파일을 읽을 때에 INFILE 구문에서 ENCODING= 옵션을 지정하는 것을 권장한다. 그러나, INFILE 구문에서 DSD DLM옵션을 사용하면, 옵션은 세션 인코딩에서 특정 문자(인용부호, Comma, 공백) 필요로 하기 때문에 ENCODING= 옵션을 필요로 한다.

     

    레코드의 길이가 긴 내부 데이터 레코드 읽기

    내부 데이터를 처리하기 위하여 DATALINES 파일 지정자와 함께 INFILE 구문을 사용 있다. INPUT 구문은 DATALINES 구문 바로 뒤의 데이터 레코드를 읽는다. CARDIMAGE 시스템 옵션을 사용하거나 CARDIMAGE 옵션이 시스템의 기본 옵션이면, SAS 공백을 덧붙여서 80byte 천공 카드 이미지와 같이 정확하게 80byte 데이터 라인을 처리한다. INFILE 구문에서 기본 FLOWOVER 옵션은 현재 레코드에서 입력 문장에 지정된 모든 변수에 대한 값을 발견하지 못하면 INPUT 구문의 다음 레코드를 읽어서 처리하도록 한다. 레코드 길이가 80바이트보다 경우에 데이터를 올바르게 처리되도록 생성하기 위하여, 입력 파일을 외부 파일로 변경하여 사용하라.

     

    참고 : NOCARDIMAGE 시스텝 옵션은 데이터 라인이 80 바이트보다 데이터 라인을 처리 있다. 인용부호 안에 위치한 문자열을 제외하고 데이터 라인의 끝은 항상 최종 토큰(token) 종료로 처리된다. 인용부호 안에 위치한 문자열은 2개의 라인에 걸쳐서 위치 있다.

     

    라인의 끝을 경유하여 읽기

    기본적으로 INPUT 구문이 현재 입력 데이터 레코드의 끝을 경유하여 읽기를 시도하면 나머지 값을 읽기 위하여 입력 포인터는 다음 레코드의 번째 열로 이동한다. 기본 작업이 FLOWOVER 옵션에 의하여 실행되고, SAS로그에 다음 메시지가 작성된다.

     

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

     

    FLOWOVER 옵션 이외의 옵션은 라인의 끝에 도달하는 경우에 INPUT 구문이 수행하는 방식을 변경한다. STOPOVER 옵션은 상태를 에러로 취급하고, 데이터 세트 구축을 중지한다. MISSOVER TRUNCOVER 옵션은 현재 INPUT 구문이 만족되지 않은 경우에 입력 포인터가 다음 레코드로 가는 것을 허용하지 않는다. @’character-string’ 함께 사용되는 SCANOVER 옵션은 지정된 문자열이 발견될 때까지 입력 레코드를 검색한다. FLOWOVER 옵션은 기본 작업 방식을 수행한다.

     

    TRUNCOVER MISSOVER 옵션은 유사하다. MISSOVER 옵션은 값의 길이가 INPUT 구문에 지정된 필드 길이보다 짧아서 전체 필드로 읽을 없다면 INPUT 구문의 값을 결측치로 설정하도록 한다. TRUNCOVER 옵션은 필드의 길이가 짧은 문자를 읽어서 적합한 변수로 작성한다.

     

    예를 들어, 가변 길이 레코드로 구성된 외부파일이 다음 레코드를 포함하고 있다.

    ----+----1----+----2
    
    1
    
    22
    
    333
    
    4444
    
    55555

     

    다음 데이터 스텝은 SAS 데이터 세트를 생성하기 위하여 위의 데이터를 읽는다. 입력 레코드 중에서 단지 하나의 레코드(55555)만이 TESTNUM변수의 입력형식(informat) 지정된 길이에 해당한다.

     

    SAS Statements
    data numbers;
    
       infile 'external-file';
    
       input testnum 5.;
    
    run;

     

    데이터 스텝은 입력 레코드를 읽기 위하여 기본 FOOWOVER 옵션이 적용되었기 때문에 5 입력 레코드 중에서 3개의 관측치를 생성한다.

     

    INFILE 구문에서 MISSOVER 옵션이 적용되면, 데이터 스텝은 5 관측치를 생성한다. 길이가 너무 짧은 레코드에서 읽은 모든 값들은 결측치로 설정된다. 현재 INPUT 구문에서 지정된 자리수보다 짧은 레코드를 읽어서 관측치를 구성하기를 원한다면, INFILE 구문에서 TRUNCOVER 옵션을 사용하라.

     

    SAS Statements
    infile 'external-file' truncover;

     

    데이터 스텝은 동일한 입력 레코드를 읽어서 5 관측치를 생성한다. SAS 데이터 세트를 비교하기 위하여 다음 테이블을 참조하라.

     

      [ INFILER 구문의 옵션에 따른 데이터 세트 생성 결과]

    OBS FLOWOVER MISSOVER TRUNCOVER
    1 22 . 1
    2 4444 . 22
    3 55555 . 333
    4   . 4444
    5   55555 55555

     


    5. 비 교

    • INFILE 구문은 데이터 스텝에서 INPUT 구문에서 사용되는 입력 파일을 지정한다. FILE 구문은 데이터 스텝에서 PUT 구문에 대한 출력 파일을 지정한다.

     

    • INFILE 구문은 일반적으로 데이터를 외부파일에서 식별한다. DATALINES 구문은 내부 파일에서 데이터 라인의 시작을 알린다. INPUT 구문에서 내부 데이터를 읽는 방법에 영향을 미치는 특정한 데이터 읽기 옵션의 장점을 적용하기 위하여 파일 지정자 DATALINES와 INFILE 구문을 함께 사용 할 수 있다.

     


    6. 관련 구문

    구문명 구문내용
    FILE 구문 PUT 구문에서 사용되는 출력 대상 파일의 이름을 지정한다.
    FILENAME 구문 SAS 파일 참조자(fileref)를 외부 파일 또는 출력 장치와 연결한다. 이와 반대로 파일 참조자(Fileref)와 외부 파일의 관계를 해제할 수 있으며, 외부 파일 속성을 출력할 수 있다.
    INFILE 구문 INPUT 구문을 사용하여 읽기 위한 외부 파일을 지정한다.
    PUT 구문 가장 최근 FILE 구문에서 지정한 SAS 로그, SAS 출력 윈도우, 또는 외부 파일 등에 출력 라인을 작성한다.

     


    7. 예 제

     

    예제1 : 구분자를 처리하는 방법을 변경하기

    기본적으로, INPUT 구문은 공백을 구분자로 사용한다. 다음 데이터 스텝은 콤마를 구분자로 사용한다.

     

    SAS Statements
    data num;
       infile datalines dsd;
       input x y z;
       datalines;
    ,2,3
    4,5,6
    7,8,9
    ;

     

    INFILE 구문에 지정된 DATALINES 인수는 내부 데이터 라인을 읽기 위하여 INFILE 구문 옵션을 사용 있도록 한다. DSD옵션은 기본 구분자로 콤마를 설정한다. 번째 라인의 번째 값에 콤마가 존재하기 때문에, 번째 관측치에서 변수 X 결측치 값이 할당되고, 변수 Y 2 할당된다.

     

    데이터에서 콤마 이외의 단일 또는 다중 구분자를 사용하기 위하여 간단하게 DELIMITER=옵션을 사용하여 구분자 값을 지정하라. 다음 예제에서 문자 a b 구분자 기능을 한다.

     

    SAS Statements
    data nums;
        infile datalines dsd delimiter='ab';
        input X Y Z;
        datalines;
    1aa2ab3
    4b5bab6
    7a8b9
    ;

     

    PROC PRINT 의해 생성된 출력물에서 NUMS 데이터 세트 결과를 있다. DSD옵션은 목록 입력 방식으로 2개의 연속된 구분자를 감지하여서 번째와 번째 관측치에 결측치 값을 할당한다. DSD 옵션을 생략하면 문자 a, b, aa, ab, ba, bb 모두 구분자 역할을 수행하고, 모든 변수에 결측값이 할당되지 않는다.

     

    [NUM 데이터 세트]

     

    Results
    The SAS System                        1
     
                           OBS    X    Y    Z
                            1     1    .    2
                            2     4    5    .
                            3     7    8    9

     

    문자열을 구분자로 사용하기 원하면, DLMSTR=옵션을 사용하여 구분자 값을 지정하라. 다음 예제에서 문자열 PRD 구분자로 사용한다. 문자열이 대소문자를 함께 포함하고 있으므로 DLMSOPT= 옵션을 사용하여 PRD, Prd, PRd, PrD, pRd, pRD, prD, prd 문자열 모두를 유효한 구분자로 사용 있다.

     

     

    SAS Statements
    data test;
        infile datalines dsd dlmstr='PRD' dlmsopt='i';
        input X Y Z;
        datalines;
    1PRD2PRd3
    4PrD5Prd6
    7pRd8pRD9
    ;

     

    PROC PRINT 출력물은 TEST 데이터 세트의 관측치를 보여준다.

     

      [TEST 데이터 세트]

    Results
    The SAS System                        1
     
                           Obs    X    Y    Z
                            1     1    2    3
                            2     4    5    6
                            3     7    8    9

     

    다음 데이터 스텝은 콤마를 구분자로 사용하며, 문자열의 일부로 콤마를 포함하고 있는 데이터를 읽기 위하여 수정된 목록 입력(modified list input) DSD옵션을 사용한다.

     

    SAS Statements
    data scores;
       infile datalines dsd;
       input Name : $9. Score
             Team  : $25. Div $;
       datalines;
    Joseph,76,"Red Racers, Washington",AAA
    Mitchel,82,"Blue Bunnies, Richmond",AAA
    Sue Ellen,74,"Green Gazelles, Atlanta",AA
    ;

     

    PROC PRINT 출력물은 SCORE 데이터 세트를 보여준다. 문자열에 포함된 구분자(comma) TEAM변수 값의 일부로 저장되었다.

     

      [SCORES 데이터 세트]

    Results
    The SAS System                        1
     
      OBS    NAME         SCORE             TEAM              DIV
       1     Joseph         76     Red Racers, Washington     AAA
       2     Mitchel        82     Blue Bunnies, Richmond     AAA
       3     Sue Ellen      74     Green Gazelles, Atlanta    AA

     


    예제2 : 목록 입력 사용하는 경우에 결측치 값과 짧은 레코드 처리하기

    다음 예제는 목록 입력 방식을 사용하여 데이터를 읽을 발생되는 문제로부터 결측치 값을 보호한다. 예제에서 일부 데이터 라인은 5 온도 값보다 적은 3개의 온도 값을 포함하고 있다. MISSOVER 옵션을 사용하여 5 보다 적은 온도값을 가지는 관측치의 변수에 결측치 값을 할당한다.

     

    SAS Statements
    data weather;
       infile datalines missover;
       input temp1-temp5;
       datalines;
    97.9 98.1 98.3
    98.6 99.2 99.1 98.5 97.5
    96.2 97.3 98.3 97.6 96.5
    ;

     

    SAS 처음 데이터 라인에서 TEMP1, TEMP2, TEMP3변수의 값에 대하여 3개의 값을 읽는다. MISSOVER 옵션은 번째 관측치의 현재 입력 데이터 레코드에서 TEMP4 TEMP5변수에 대응되는 값이 존재하지 않으므로 결측치 값으로 설정한다.

     

    MISSOVER 생략하거나 FLOWOVER 옵션을 사용하는 경우에 입력 포인터를 2번째 라인으로 이동하여 TEMP4 TEMP5 변수의 값을 읽는다. 데이터 스텝이 실행된 다음에 SAS 새로운( 번째) 관측치 값으로 3번째 라인을 읽는다. 그리고, SAS 로그에 다음 메시지가 출력된다.

     

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

     

    INFILE 구문에서 STOPOVER 옵션을 사용 있다. STOPOVER 옵션은 INPUT 구문이 원시(Raw) 데이터 레코드에서 충분한 개수의 관측치를 발견하지 못하면 실행을 중지 시킨다.

     

    infile datalines stopover;

     

    SAS 처음 레코드에서 TEMP4 변수 값을 발견하지 못하였기 때문에 내부 변수 _ERROR_ 1 설정하고, 데이터 세트 구축을 중지하고 번째 데이터 라인을 출력한다.

     


    예제3 : 지정한 문자열에서 가변 길이 레코드 검색하기

    다음 예제는 전화번호부에서 전화번호를 가져오기 위하여 SCANOVER TRUNCOVER 옵션을 함께 사용하는 방법을 보여준다. “phone:” 단어가 전화번호 앞에 위치한다. 전화번호는 국제 번호를 포함하기 때문에 최대 길이는 32이다.

     

     

    SAS Statements
    filename phonebk host-specific-path;
    data _null_;
      file phonebk;
      input line $80.;
      put line;
      datalines;
        Jenny's Phone Book
        Jim Johanson phone: 619-555-9340
           Jim wants a scarf for the holidays.
        Jane Jovalley phone: (213) 555-4820
           Jane started growing cabbage in her garden.
           Her dog's name is Juniper.
        J.R. Hauptman phone: (49)12 34-56 78-90
           J.R. is my brother.
       ;
    run;

     

    파일 라인에서 전화번호를 검색하여서, 전화번호가 시작하는 곳에 파일 포인터를 위치시키기 위하여 @’phone:’ 지정자를 사용하라. ‘phone:’문자를 포함하지 않는 라인을 삭제하고, 로그에 전화번호만을 작성하기 위하여 TRUNCOVER 옵션과 SCANOVER 옵션을 함께 사용한다.

     

    SAS Statements
    data _null_;
       infile phonebk truncover scanover;
       input @'phone:' phone $32.;
       put phone=;
    run;

     

    프로그램은 SAS로그에 다음 전화번호를 출력한다.

     

      [LOG 출력 결과]

    Results
    phone=619-555-9340
    phone=(213) 555-4820
    phone=(49)12 34-56 78-90

     


    예제4 : 가변 길이 레코드를 포함하는 파일 읽기

    다음 예제는 가변 길이 레코드를 포함하는 파일을 읽기 위하여 LENGTH= $VARYING 입력형식(informat) 함께 사용하는 방법을 보여준다

     

    SAS Statements
    data a;
       infile file-specification length=linelen lrecl=510 pad;
       input firstvar 1-10 @;  /* LINELEN 할당 */
       varlen=linelen-10;      /* VARLEN 계산  */
       input @11 secondvar $varying500. varlen;
    run;

     

    다음은 데이터 스텝에서 처리하는 내용이다.

     

    • INFILE 구문은 변수 LINELEN을 생성하지만 값을 할당하지 않는다.
    • 첫 번째 INPUT 구문이 실행되는 경우에 SAS는 레코드의 라인 길이를 정의하고, LINELEN 변수에 값을 할당한다. 단일 후행 @는 다음 INPUT 구문이 처리되기 전까지 입력 버퍼에서 레코드 처리를 보류한다.
    • 할당문은 VARLEN의 길이를 정의하기 위하여 2개의 알려진 길이(FIRSTVAR의 길이와 전체 레코드의 길이)를 사용한다.
    • 두 번째 INPUT 구문은 SECONDVAR변수를 읽기 위하여 입력형식(informat) $VARYING500. 과 함께 VARLEN 값을 사용한다.

     


    예제5 : 다중 입력 파일 읽기

    다음 데이터 스텝은 데이터 스텝의 개별 반복을 하는 동안에 2개의 입력 파일을 읽는다. SAS 하나의 파일에서 다음 파일로 전환 때에 파일은 열린 상태를 유지한다. 입력 포인터는 INPUT 구문이 파일을 다시 읽을 때에 위치에서 다시 읽기 시작하기 위하여 해당 위치를 유지하고 대기한다.

     

    SAS Statements
    data qtrtot(drop=jansale febsale marsale aprsale maysale junsale);
         /* 1번째 파일의 위치 확인 */
       infile file-specification-1;
         /* 1번째 파일에서 관측값을 읽는다. */
       input name $ jansale febsale marsale;
       qtr1tot=sum(jansale,febsale,marsale);
     
         /* 2번째 파일의 위치 확인 */
       infile file-specification-2;
         /* 2번째 파일에서 관측값을 읽는다. */
       input @7 aprsale maysale junsale;
       qtr2tot=sum(aprsale,maysale,junsale);
    run;

     

    데이터 스텝은 입력 파일 중에 레코드 개수가 적은 입력 파일의 끝에 도착할 때에 종료한다. 다음 데이터 스텝은 데이터 스텝의 개별 반복을 하는 동안에 다른 파일에서 레코드를 계속 읽기 위하여 FILEVAR=옵션을 사용한다.

     

    SAS Statements
    data allsales;
       length fileloc myinfile $ 300;
       input fileloc $ ; /* 내부 데이터 읽기 */
     
       infile file-specification filevar=fileloc
              filename=myinfile end=done;
     
      /* 마지막 입력 레코드를 읽으면 DONE이 1로 설정된다.    */
       do while(not done);
      /* 현재 열려있는 입력 파일에서 모든 입력 레코드를 읽고, */
      /*  ALLSALES 데이터 세트에 작성한다.                    */
         input name $ jansale febsale marsale;
         output;
       end;
       put 'Finished reading ' myinfile=;
       datalines;
    external-file-1
    external-file-2
    external-file-3
    ;

     

    FILENAME= 옵션은 MYINFILE변수에 현재 입력 파일의 이름을 할당한다. LENGTH 구문은 FILENAME=변수와 FILEVAR=변수가 파일 이름의 값을 정확하게 저장 있도록 충분한 길이를 지정해야 한다. PUT 구문은 SAS로그에 현재 열려있는 입력 파일의 물리적 이름을 출력한다.

     


    예제6 : 외부 파일 갱신

    다음 예제는 제자리에서 외부파일을 갱신하기 위하여 INFILE 구문과 SHAREBUFFERS옵션, INPUT, FILE, PUT 구문을 함께 사용하는 방법을 보여준다.

     

    SAS Statements
    data _null_;
         /* INFILE과 FILE 구문은        */
         /* 동일한 파일을 지정해야 한다. */
       infile file-specification-1 sharebuffers;
       file file-specification-1;
       input state $ 1-2 phone $ 5-16;
         /* NC(North Carolina)의 지역 코드를 변경 */
       if state= 'NC' and substr(phone,5,3)='333' then
         phone='910-'||substr(phone,5,8);
       put phone 5-16;
    run;

     


    예제7 : 복사된 레코드 절단하기

    LENGTH=옵션은 PUT _INFILE_ 구문을 사용하여 입력 파일을 다른 파일에 복사하는 경우에 유용하다. 복사된 레코드의 열을 자르기 위하여 LENGTH= 옵션을 사용하라. 예를 들어, 다음 문장은 입력 데이터가 출력 파일에 작성되기 전에 입력 데이터 레코드의 20번째 이후의 열을 절단하여 출력한다.

     

    SAS Statements
    data _null_;
       infile  file-specification-1 length=a;
       input;
       a=a-20;
       file file-specification-2;
       put _infile_;
    run;

     

    START=옵션은 PUT _INFILE_ 구문으로 복사하는 파일의 레코드를 절단하기 원하는 경우에 유용하다. 예를 들어, 개별 레코드의 처음 10 열을 복사하는 것을 원하지 않는 경우에 문장은 입력 버퍼에서 11번째 열부터 레코드의 끝까지 복사한다.

     

    SAS Statements
    data _null_;
       infile file-specification start=s;
       input;
       s=11;
       file file-specification-2;
       put _infile_;
    run;

     


    예제8 : 포인터 위치 나열하기

    다음 데이터 스텝은 입력 버퍼에서 현재 포인터가 존재하고 있는 위치의 값을 LINEPT COLUMNPT 변수에 할당한다.

     

    SAS Statements
    data _null_;
       infile datalines n=2 line=Linept col=Columnpt;
       input name $ 1-15 #2 @3 id;
       put linept= columnpt=;
       datalines;
    J. Brooks
      40974
    T. R. Ansen
      4032
    ;

     

    다음 문장은 입력 포인터가 PUT 구문이 실행되었을 입력 버퍼에서 번째 라인에 위치하기 때문에 데이터 스텝의 개별 실행 후에 다음 라인을 출력한다.

     

     [LOG 출력 결과]

    Results
    Linept=2 Columnpt=9
    Linept=2 Columnpt=8

     


    예제9 : 입력 버퍼에서 데이터 작업하기

    _INFILE_ 변수는 INPUT 구문이 가장 최근에 읽은 레코드를 항상 포함한다. 다음 예제는 _INFILE_ 변수의 사용을 설명한다.

     

    • INPUT 구문을 사용하지 않고 라인을 개별적으로 분리하여 처리하는 작업을 수행하기 위하여 전체 레코드를 읽거나
    • SAS로그에 작성을 원하는 전체 레코드를 읽기 위하여
    • INPUT 구문을 사용하여 변수에 대응되는 라인을 분리하여 읽기 전에 입력 레코드의 항목을 수정하기 위하여

     

    예제 파일은 전화번호 정보를 포함하고 있다. 숫자 데이터 Minutes, Charge 변수는 꺾음 괄호 (<>)안에 위치하고 있다.

     

    SAS Statements
    filename phonbill host-specific-filename;
    data _null_;
       file phonbill;
       input line $80.;
       put line;
       datalines;
       City Number Minutes Charge
       Jackson 415-555-2384 <25> <2.45>
       Jefferson 813-555-2356 <15> <1.62>
       Joliet 913-555-3223 <65> <10.32>
       ;
    run;

     

    다음 코드는 개별 레코드를 읽고, minute charge 값을 추출하기 위하여 레코드를 분해한다.

     

    SAS Statements
    data _null_;
       infile phonbill firstobs=2;
       input;
       city = scan(_infile_, 1, ' ');
       char_min = scan(_infile_, 3, ' ');
       char_min = substr(char_min, 2, length(char_min)-2);
       minutes = input(char_min, BEST12.);
       put city= minutes=;
    run;

     

      [LOG 출력 결과]

    Results
    city=Jackson minutes=25
    city=Jefferson minutes=15
    city=Joliet minutes=65

     

    다음 코드에서 INPUT 구문은 파일에서 레코드를 읽는다. PUT 구문에서 자동 _INFILE_ 변수는 로그에 레코드를 작성하기 위하여 사용된다.

     

    SAS Statements
    data _null_;
       infile phonbill;
       input;
       put _infile_;
    run;

     

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

     

     [LOG 출력결과]

    Results
    City Number Minutes Charge
    Jackson 415-555-2384 <25> <2.45>
    Jefferson 813-555-2356 <15> <1.62>
    Joliet 913-555-3223 <65> <10.32>

     

    다음 코드에서, 번째 INPUT 구문은 입력 버퍼에서 레코드를 읽은 후에 상태를 유지한다. _INFILE_= 옵션은 숫자 데이터에서 꺾음 괄호(<>) 제거한다. 번째 INPUT 구문은 버퍼에서 값을 분해하여 읽는다.

     

    SAS Statements
    data _null_;
       length city number $16. minutes charge 8;
       infile phonbill firstobs=2;
       input @;
       _infile_ = compress(_infile_, '<>');
       input city number minutes charge;
       put city= number= minutes= charge=;
    run;

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

    Results
    city=Jackson number=415-555-2384 minutes=25 charge=2.45
    city=Jefferson number=813-555-2356 minutes=15 charge=1.62
    city=Joliet number=913-555-3223 minutes=65 charge=10.32

     


    예제10 : 다중 파일을 입력 파일로 접근하기

    다음 예제는 다중 파일을 읽고 개별 파일에 대한 입력 버퍼를 접근하기 위하여 _INFILE_ 자동 변수와 _INFILE_= 옵션을 사용한다. 다음 코드는 4 파일을 생성한다.(3 데이터 파일과 모든 데이터 파일의 이름을 저장하는 파일.)

    번째 데이터 스텝은 파일 이름이 저장되어 있는 파일을 읽고, 개별 데이터 파일을 열어서 로그에 데이터 항목을 작성한다. PUT 구문은 파일 이름에 대한 _INFILE_ 데이터 파일에 대한 _INFILE_ 필요로 하고, 파일이름에 대한 _INFILE_ 변수는 fname으로 참조된다.

     

    SAS Statements
    data _null_;
       do i = 1 to 3;
          fname= 'external-data-file' || put(i,1.) || '.dat';
          file datfiles filevar=fname;
          do j = 1 to 5;
             put i j;
          end;
     
          file 'external-filenames-file';
          put fname;
       end;
    run;
     
    data _null_;
       infile 'external-filenames-file' _infile_=fname;
       input;
     
       infile datfiles filevar=fname end=eof;
       do while(^eof);
          input;
          put fname _infile_;
       end;
    run;

     

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

     

    [LOG 출력결과]

    Results
    NOTE: The infile 'external-filenames-file' is:
          File Name=external-filenames-file,
          RECFM=V, LRECL=256
     
    NOTE: The infile DATFILES is:
          File Name=external-data-file1.dat,
          RECFM=V, LRECL=256
     
    external-data-file1.dat 1 1
    external-data-file1.dat 1 2
    external-data-file1.dat 1 3
    external-data-file1.dat 1 4
    external-data-file1.dat 1 5
     
    NOTE: The infile DATFILES is
          File Name=external-data-file2.dat,
          RECFM=V, LRECL=256
     
    external-data-file2.dat 2 1
    external-data-file2.dat 2 2
    external-data-file2.dat 2 3
    external-data-file2.dat 2 4
    external-data-file2.dat 2 5
     
    NOTE: The infile DATFILES is
          File Name=external-data-file3.dat,
          RECFM=V, LRECL=256
     
    external-data-file3.dat 3 1
    external-data-file3.dat 3 2
    external-data-file3.dat 3 3
    external-data-file3.dat 3 4
    external-data-file3.dat 3 5

     


    예제11 : 외부 파일에 대한 인코딩 지정하기

    다음 예제는 외부 파일을 읽어서 SAS 데이터 세트를 생성한다. 외부 파일의 인코딩은 UTF-8이고, 현재 세션 인코딩은 Wlatin1이다. 기본적으로, SAS 외부파일이 세션 인코딩과 같은 인코딩을 가지도록 시도한다.

     

    외부파일을 읽을 경우에 사용하기 위한 인코딩이 무엇인지 SAS에게 지시하기 위하여 ENCODING=옵션을 지정하라. 외부 파일이 UTF-8 존재하고 있다는 것을 SAS에게 알리면, 새로운 SAS데이터 세트를 작성하면서 인코딩을 외부파일 인코딩 UTF-8에서 현재 세션 인코딩으로 전환한다. 그러므로, 데이터는 새로운 데이터 세트에 Wlatin1 인코딩으로 올바르게 작성된다.

     

    SAS Statements
    libname myfiles 'SAS-library';
     
    filename extfile 'external-file';
     
    data myfiles.unicode;
       infile extfile encoding="utf-8";
       input Make $ Model $ Year;
    run;

     


     


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

     

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

     

    반응형

    댓글