데이터 스터디/SAS

SAS - 데이터 읽기 실습 (input, infile, proc import, dlm='')

케이와이엠 2023. 3. 22. 12:10

3장. DATA STEP 1

이번엔 저번에 다루었던 RAW DATA 읽기 명령문을 사용해서, 데이터 실습해보자

 

이때 잠깐, WORK 탐색기에 너무 많은 데이터셋이 저장되어 있다.

이를 지울려면 하나 하나 지울수도 있지만 PROC DELETE DATA=삭제하려는 데이터셋; RUN; 을 해보자

EX. proc DELETE data=one1-one7; run;

 


1. COLUMN INPUT : 고정 포맷 & 표준 데이터 유형

- 열 번호 지정

- 자료값이 고정된 열을 갖고 있어야 함 : 시작 위치 - 끝 위치 표시

-- 문법 : 변수명 / 변수유형($인지 아닌지) / 시작위치-끝위치

EX. age 1-2, gen$ 6-18, gen$3-3 = gen$3

COLOUMN INPUT은 시작위치, 끝 위치를 지정하기 때문에

각 변수들이 다 그 위치에 속하게끔 직접 띄워써서 자리를 맞춘다.

 

* 저렇게 이름에 띄워쓰기가 있는 경우에는

INPUT 전에 LENGTH 써서 글자 수 제한두는 걸론 안됨.

LENGTH문은 최대 허용 글자 수를 지정해주는거라

LENGTH name $ 10 하면 10글자 까지 쓸 수 있다라는 의미고

INPUT name $ 10 하면 꼭 10바이트까지가 name에 해당한다는 의미 !


2. FORMATTED INPUT : 고정 포맷 &비 표준 데이터 유형

- 각 레코드의 변수별 데이터 값 시작위치가 동일

- INPUT @입력시작위치 변수명 입력포맷(정수부분.소수점부분)

- INFILE'위치' => CARDS 사용하지 않는다는 뜻

- 순서 : DATA지정 -> INFILE txt읽어오기 -> INPUT 으로 변수 읽기 -> RUN

 

@열 포인트를 지정해주고

정수부분. 소수부분 지정해준다.


3. LIST INPUT : 자유 포맷 &표준 데이터 유형

-입력 방법은 변수명 변수 유형 ex) age gen $

- 문자열은 공백을 포함하지 않고 8자 이하까지 나옴

- 8자를 초과하는 문자데이터에는 LENGTH 문장으로 미리 선언 ex) LENTH name $ 10 ;

 

이건 name을 문자형으로 $ 지정해서 최대 8글자밖에 못읽어냄

근데 이제 그 전에 length 문으로 글자 수를 지정해주면

밑에 name $ 해도 글자 수 제한 없어짐

# LENGTH 문

- 변수의 속성을 선언하는 구문

-변수값을 저장하기 위해 사용되는 저장공간, 단위로는 바이트

- INPUT 명령문 에 LENGTH 변수명 $ 바이트 ;

-영문자 : 1바이트, 한글 : 2바이트 차지

 

3.1 LIST INPUT의 구분자 읽기

- 일단 직접 텍스트 파일에 들어가서 구분자가 뭔지 확인해보기

- INFILE 문장안에 dlm='구분자' 로 정의함

** 이때 INFILE 이랑 dlm 안에 내용은 작은 따옴표로 묶어야함

- 구분자 지정을 따로 안하면 공백이 구분자로 인식됨

 

[수업 예시 1]

txt 파일

+1단계. 일단 넣기

infile 문에서 dlm 으로 구분자 구분 해줌

근데 first_name last_name job_title 이 8글자에서 끊김

 

+2단계. length문으로 글자수 지정해주기

그러면 first_name에 대해서는 글자가 10글자 꽉 채워서 나옴

근데 length했더니 first_name변수가 맨 앞으로 가버림 !!

 

+3단계. 변수 순서 정해주기

여기서 retain 문으로 순서를 정하고

set문으로 위에서 만들어준 subset4 데이터셋을 복사함

 

[수업 예시 2]

마지막 변수들 birth_date랑 hire_date 표시하기

이러면 hire_date 부분에 오류가 뜬다.

이때 hire_date 뒤에 : 를 붙여주면 해결된다.

birth_date 의 데이터값이 11AUG1969 => 입력 포맷은 : date. = => 저장은 3510으로 

hire_date의 데이터값이 06/01/1989 => 입력포맷은 : mmddyy. ==> 저장은 10744로 

이때 대체 가능한 방법

1. birth_date :date. hire_date :mmddyy. ;

2. birth_date date9. hire_date :mmddyy. ;

3. birth_date :date. hire_date :mmddyy10.

 

[수업 예시3]

txt 파일

여기에 첫번 째 열은 제외하고 읽어야함

이때 그래서 column input 써서 age 3-4해주면 됨

 

4. PROC STEP 에서 구분자 구분 (자주 사용은 x)

-PROC import datafile = " "

out = ## dbms = dlm replace;

delimiter='&';

getnames= yes;

run;

 

[예시 1 - txt파일 불러오기]

out = mydata : mydata라는 데이터셋에 저장

getnames = yes : 첫열에 있는 변수명을 포함하자

 

[예시2 - csv 파일 불러오기]

FILENAME REFFILE 'C:\data7\sample.csv';  /*불러올 파일*/
PROC IMPORT DATAFILE=REFFILE
DBMS=CSV  /*불러오는 파일 형식*/
OUT=sample_import;  /*저장할 형태_폴더명.파일명*/
GETNAMES=YES;
RUN;
 

여기서 불러오는 파일이 xlsx 형식이라면, DBMS=CSV를 DBMS=XLSX로 바꾸면 된다.

 

===여기까지 data step 1 끝 !=====