Main Content

텍스트 파일에서 숫자형 데이터 블록 가져오기

이 예제에서는 텍스트 파일에서 블록으로 구성된 숫자형 데이터를 읽어오는 방법을 보여줍니다. 파일 내 각 블록은 서로 다른 형식을 가질 수 있습니다. 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 루프에서 데이터의 각 블록을 읽어옵니다. 이 루프는 파일의 끝에 도달하고 ~feoffalse를 반환할 때까지 실행됩니다. 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);

참고 항목

관련 항목