텍스트 파일에서 숫자형 데이터 블록 가져오기
이 예제에서는 텍스트 파일에서 블록으로 구성된 숫자형 데이터를 읽어오는 방법을 보여줍니다. 파일 내 각 블록은 서로 다른 형식을 가질 수 있습니다. textscan
을 사용하여 한 번에 하나씩 모든 블록을 셀형 배열로 읽어올 수 있습니다.
파일 형식 개요
샘플 텍스트 파일 test80211.txt
에 들어 있는 정보는 무선 네트워크의 통신 품질을 테스트한 결과입니다. 이 샘플 파일은 소개 문구에 해당하는 라인이 4줄 있고 그 뒤부터는 여러 개의 데이터 블록으로 구성되어 있습니다. 각 블록마다 다른 환경(예: 모바일, 실내, 실외)을 나타내며 다음과 같은 형식을 가집니다.
설명에 해당하는 2줄의 헤더 라인
텍스트
Num SNR=
및 숫자형 값m
m
개 열과 임의 개수의 행으로 구성된 테이블 형식의 숫자형 데이터(데이터는 쉼표로 구분됨)블록의 끝을 나타내는 텍스트
*
EOB
예를 들어, 하나의 블록 단위 데이터는 다음과 같은 형식을 가집니다.
* Indoor2
* SNR Vs test No
Num SNR=3
,-5.00E+00,-4.00E+00,
1.00E+00,3.32E-07,9.12E-07
2.00E+00,1.49E-07,2.44E-07
3.00E+00,6.04E-07,2.53E-07
4.00E+00,1.53E-07,4.25E-07
5.00E+00,1.82E-07,1.83E-07
6.00E+00,6.27E-07,8.21E-07
7.00E+00,9.10E-08,1.53E-08
8.00E+00,8.73E-07,6.45E-07
9.00E+00,4.40E-07,1.33E-07
*EOB
숫자형 데이터는 여러 독립적인 테스트에서 얻은 잡음 수준 범위의 오차율을 나타냅니다. 첫 번째 열은 테스트 번호를 나타냅니다. 전체 샘플 파일을 보려면 명령줄에 다음을 입력하십시오.
open test80211.txt
읽어 들일 텍스트 파일 열기
파일을 열고 파일 ID를 만듭니다.
fileID = fopen('test80211.txt','r');
소개 문구에 해당하는 라인 읽기
소개 문구에 해당하는 4줄의 라인을 읽습니다. 이들 라인은 새 줄(newline) 문자로 구분된 텍스트입니다. textscan
은 문자형 벡터로 구성된 4×1 셀형 배열을 포함하는 1×1 셀형 배열을 반환합니다.
Intro = textscan(fileID,'%s',4,'Delimiter','\n')
Intro = 1x1 cell array
{4x1 cell}
첫 번째 셀의 내용을 확인합니다.
disp(Intro{1})
{'*CCX' } {'*CCX WiFi conformance test'} {'*CCX BER Results' } {'*CCX' }
각 블록 읽기
각 블록마다 헤더, 숫자형 값 m
, 데이터의 열 제목 그리고 해당 데이터를 읽어보겠습니다. 먼저, 블록 인덱스를 초기화합니다.
Block = 1;
while
루프에서 데이터의 각 블록을 읽어옵니다. 이 루프는 파일의 끝에 도달하고 ~feof
가 false
를 반환할 때까지 실행됩니다. textscan
함수는 각 블록의 데이터를 InputText
라는 셀형 배열로 반환합니다. cell2mat
를 사용하여 각 셀형 배열을 숫자형 배열로 변환하고 그 숫자형 배열을 Data
라는 셀형 배열로 저장합니다. 셀형 배열에는 다양한 크기의 블록을 저장할 수 있습니다.
while (~feof(fileID)) % For each block: fprintf('Block: %s\n', num2str(Block)) % Print block number to the screen InputText = textscan(fileID,'%s',2,'delimiter','\n'); % Read 2 header lines HeaderLines{Block,1} = InputText{1}; disp(HeaderLines{Block}); % Display header lines InputText = textscan(fileID,'Num SNR = %f'); % Read the numeric value % following the text, Num SNR = NumCols = InputText{1}; % Specify that this is the % number of data columns FormatString = repmat('%f',1,NumCols); % Create format string % based on the number % of columns InputText = textscan(fileID,FormatString, ... % Read data block 'delimiter',','); Data{Block,1} = cell2mat(InputText); [NumRows,NumCols] = size(Data{Block}); % Determine size of table disp(cellstr(['Table data size: ' ... num2str(NumRows) ' x ' num2str(NumCols)])); disp(' '); % New line eob = textscan(fileID,'%s',1,'delimiter','\n'); % Read and discard end-of-block marker Block = Block+1; % Increment block index end
Block: 1
{'* Mobile1' } {'* SNR Vs test No'}
{'Table data size: 30 x 19'}
Block: 2
{'* Mobile2' } {'* SNR Vs test No'}
{'Table data size: 30 x 9'}
Block: 3
{'* Mobile3' } {'* SNR Vs test No'}
{'Table data size: 31 x 15'}
Block: 4
{'* Mobile4' } {'* SNR Vs test No'}
{'Table data size: 28 x 19'}
Block: 5
{'* Mobile5' } {'* SNR Vs test No'}
{'Table data size: 32 x 18'}
Block: 6
{'* Mobile6' } {'* SNR Vs test No'}
{'Table data size: 30 x 19'}
Block: 7
{'* Mobile7' } {'* SNR Vs test No'}
{'Table data size: 30 x 11'}
Block: 8
{'* Mobile8' } {'* SNR Vs test No'}
{'Table data size: 20 x 18'}
Block: 9
{'* Indoor0' } {'* SNR Vs test No'}
{'Table data size: 9 x 3'}
Block: 10
{'* Indoor1' } {'* SNR Vs test No'}
{'Table data size: 22 x 6'}
Block: 11
{'* Indoor2' } {'* SNR Vs test No'}
{'Table data size: 25 x 3'}
Block: 12
{'* Indoor3' } {'* SNR Vs test No'}
{'Table data size: 21 x 18'}
Block: 13
{'* Outdoor1' } {'* SNR Vs test No'}
{'Table data size: 20 x 18'}
Block: 14
{'* Outdoor2' } {'* SNR Vs test No'}
{'Table data size: 23 x 3'}
Block: 15
{'* Outdoor3' } {'* SNR Vs test No'}
{'Table data size: 22 x 18'}
Block: 16
{'* Outdoor4' } {'* SNR Vs test No'}
{'Table data size: 21 x 18'}
Block: 17
{'* Outdoor5' } {'* SNR Vs test No'}
{'Table data size: 18 x 5'}
텍스트 파일 닫기
fclose(fileID);
총 블록 개수
파일에 포함된 블록의 개수를 확인합니다.
NumBlocks = Block-1
NumBlocks = 17
숫자형 데이터 보기
짧은 형식 과학 표기법을 사용하여 특정 블록의 숫자형 데이터를 표시합니다.
먼저, 현재 명령 창의 출력 표시 형식을 저장합니다.
user_format = get(0, 'format');
표시 형식을 짧은 형식 과학 표기법으로 변경합니다.
format shortE
9번째 블록의 헤더 라인과 숫자형 데이터를 표시합니다.
Block = 9; disp(HeaderLines{Block});
{'* Indoor0' } {'* SNR Vs test No'}
fprintf('SNR %d %d\n',Data{Block,1}(1,2:end))
SNR -7 -6
disp(Data{Block,1}(2:end,2:end));
9.0600e-07 6.7100e-07 3.1700e-07 3.5400e-07 2.8600e-07 1.9600e-07 1.4800e-07 7.3400e-07 3.9500e-08 9.6600e-07 7.9600e-07 7.8300e-07 4.0000e-07 8.8100e-07 3.0100e-07 2.9700e-07
명령 창의 출력 표시 형식을 원래 형식으로 되돌립니다.
set(0, 'format', user_format);