MATLAB 데이터 가져오기: 외부 파일 효율적으로 로드하기
importdata 함수 개요
MATLAB에서 데이터 가져오기란 외부 파일에서 데이터를 로드하는 것입니다. importdata 함수는 다양한 형식의 파일을 불러올 수 있으며 5가지 구문을 제공합니다.
| 번호 | 구문 및 설명 |
| 1 | A = importdata(filename) - 파일에서 배열 A로 데이터 로드 |
| 2 | A = importdata('-pastespecial') - 시스템 클립보드에서 데이터 로드 |
| 3 | A = importdata(___, delimiterIn) - ASCII 파일/클립보드에서 열 구분자 지정 |
| 4 | A = importdata(___, delimiterIn, headerlinesIn) - 헤더 줄 수 지정 후 숫자 데이터 로드 |
| 5 | [A, delimiterOut, headerlinesOut] = importdata(___) - 감지된 구분자와 헤더 줄 수 반환 |
예제 1: 이미지 파일 로드
filename = 'smile.jpg';
A = importdata(filename);
image(A);
현재 디렉토리에 파일이 있어야 합니다. 실행 시 이미지가 표시됩니다.
예제 2: 텍스트 파일 가져오기 (구분자, 헤더 지정)
weeklydata.txt (공백 구분, 첫 줄 헤더):
SunDay MonDay TuesDay WednesDay ThursDay FriDay SaturDay
95.01 76.21 61.54 40.57 55.79 70.28 81.53
73.11 45.65 79.19 93.55 75.29 69.87 74.68
60.68 41.85 92.18 91.69 81.32 90.38 74.51
48.60 82.14 73.82 41.03 0.99 67.22 93.18
89.13 44.47 57.63 89.36 13.89 19.88 46.60
filename = 'weeklydata.txt';
delimiterIn = ' ';
headerlinesIn = 1;
A = importdata(filename, delimiterIn, headerlinesIn);
for k = 1:7
disp(A.colheaders{1, k})
disp(A.data(:, k))
disp(' ')
end
실행 결과: 각 요일 헤더와 해당 열 데이터가 출력됩니다.
예제 3: 클립보드에서 가져오기
클립보드에 "Mathematics is simple" 복사 후:
A = importdata('-pastespecial')
결과: A = 'Mathematics is simple'
저수준 파일 I/O (Low-Level File I/O)
importdata는 고수준 함수입니다. 저수준 I/O 함수는 바이트/문자 단위 읽기/쓰기를 세밀하게 제어하지만 파일 형식에 대한 자세한 정보가 필요합니다.
주요 저수준 I/O 함수
| 함수 | 설명 |
| fclose | 열린 파일 닫기 |
| feof | 파일 끝 여부 확인 |
| ferror | 파일 I/O 오류 정보 |
| fgetl | 한 줄 읽기(개행 문자 제거) |
| fgets | 한 줄 읽기(개행 문자 유지) |
| fopen | 파일 열기/정보 얻기 |
| fprintf | 텍스트 파일에 데이터 쓰기 |
| fread | 바이너리 파일에서 데이터 읽기 |
| frewind | 파일 위치 지시자를 처음으로 |
| fscanf | 텍스트 파일에서 포맷된 데이터 읽기 |
| fseek | 파일 내 지정 위치로 이동 |
| ftell | 파일 내 현재 위치 |
| fwrite | 바이너리 파일에 데이터 쓰기 |
저수준 I/O로 텍스트 데이터 가져오기
주요 함수: fscanf(포맷 읽기), fgetl/fgets(한 줄 읽기), fread(바이트/비트 스트림 읽기).
실전 예제: 강우량 데이터 파일 파싱
myfile.txt 구조: 헤더에 월 수 M, 이후 M개 측정 세트(각 7행 5열).
filename = '/data/myfile.txt';
rows = 7; cols = 5;
fid = fopen(filename);
M = fscanf(fid, '%*s %*s\n%*s %*s %*s %*s\nM=%d\n\n', 1); % 헤더 파싱, M 추출
for n = 1:M
mydata(n).time = fscanf(fid, '%s', 1);
mydata(n).month = fscanf(fid, '%s', 1);
mydata(n).raindata = fscanf(fid, '%f', [rows, cols]); % 열 우선 저장됨 → 전치 필요
end
for n = 1:M
disp(mydata(n).time), disp(mydata(n).month)
disp(mydata(n).raindata)
end
fclose(fid);
실행 결과: 각 측정 세트의 시간, 월, 강우량 행렬이 구조체 배열 mydata에 저장되어 출력됩니다.