포스팅 목차
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) 리스트 링크 |
'SAS > SAS 구문사전' 카테고리의 다른 글
【SAS Statement】 KEEP 구문 (0) | 2022.02.02 |
---|---|
【SAS Statement】 INPUT 구문, 변수 이름 지정 입력 방식 (0) | 2022.02.02 |
【SAS Statement】 INPUT 구문, 입력형식 지정 입력방식(포맷 지정 입력형식) (0) | 2022.02.02 |
【SAS Statement】 INPUT 구문, Column (열입력방식) (0) | 2022.02.01 |
【SAS Statement】 INPUT 구문 (0) | 2022.02.01 |
댓글