ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

TEXTSCAN を使った任意の形式のテキスト ファイルの読み取り

この例では、textscan を使用して任意の形式のテキスト ファイルを読み取る方法を示します。この関数は、textread に似ていますが、一度にファイルの 1 ブロックを読み取ることが可能であり、各ブロックは異なる形式をもつことができます。テキスト ファイル test80211.txt の情報はワイヤレス ネットワーク通信の品質テストの結果です。各ブロックは、(たとえば、モバイル、室内、室外といった) 異なる環境です。数値結果は、多数の独立したテストについてノイズ レベルのある範囲にわたるデータ エラー率を示します。

ファイル形式

4 行のイントロダクションの後に、このファイルはそれぞれ以下の形式の多数のデータ ブロックで構成されます。

  • 2 つのヘッダー行の説明

  • パラメーター m

  • p 行 m 列のデータ テーブル

すべての情報は、異なるサイズのブロックの格納を許可するセル配列に読み取られます。

読み取りのためのテキスト ファイルを開く

fid = fopen('test80211.txt','r');  % Open text file

イントロダクション行の読み取り

InputText = textscan(fid,'%s',4,'delimiter','\n');  % Read strings delimited
% by a carriage return
Intro = InputText{1};
disp(Intro);
    '*CCX'
    '*CCX WiFi conformance test'
    '*CCX BER Results'
    '*CCX'

各ブロックの読み取り

ブロックごとに、ヘッダー、テーブル名、データに対する列ヘッダーを読み取り、その後でデータ自体を読み取ります。

Block = 1;                                             % Initialize block index
while (~feof(fid))                                     % For each block:

   sprintf('Block: %s', num2str(Block));              % Display block number
   InputText = textscan(fid,'%s',2,'delimiter','\n'); % Read header line
   HeaderLines{Block,1} = InputText{1};
   disp(HeaderLines{Block});

   InputText = textscan(fid,'Num SNR = %f');          % Read parameter value
   NumCols = InputText{1};

   FormatString = repmat('%f',1,NumCols);             % Create format string
   % based on parameter
   InputText = textscan(fid,FormatString, ...         % Read data block
      'delimiter',',');

   Data{Block,1} = cell2mat(InputText);               % Convert to numerical
   % array from cell
   [NumRows,NumCols] = size(Data{Block});             % Size of table
   disp(cellstr(['Table data size: ' ...
      num2str(NumRows) ' x ' num2str(NumCols)]));
   disp(' ');                                         % New line

   eob = textscan(fid,'%s',1,'delimiter','\n');       % Read and discard EOB
   % marker (Here, 'EOF')
   Block = Block+1;                                   % Increment block index
end
    '*       Mobile1'
    '*       SNR Vs test No'

    'Table data size: 30 x 19'

 
    '*       Mobile2'
    '*       SNR Vs test No'

    'Table data size: 30 x 9'

 
    '*       Mobile3'
    '*       SNR Vs test No'

    'Table data size: 31 x 15'

 
    '*       Mobile4'
    '*       SNR Vs test No'

    'Table data size: 28 x 19'

 
    '*       Mobile5'
    '*       SNR Vs test No'

    'Table data size: 32 x 18'

 
    '*       Mobile6'
    '*       SNR Vs test No'

    'Table data size: 30 x 19'

 
    '*       Mobile7'
    '*       SNR Vs test No'

    'Table data size: 30 x 11'

 
    '*       Mobile8'
    '*       SNR Vs test No'

    'Table data size: 20 x 18'

 
    '*       Indoor0'
    '*       SNR Vs test No'

    'Table data size: 9 x 3'

 
    '*       Indoor1'
    '*       SNR Vs test No'

    'Table data size: 22 x 6'

 
    '*       Indoor2'
    '*       SNR Vs test No'

    'Table data size: 25 x 3'

 
    '*       Indoor3'
    '*       SNR Vs test No'

    'Table data size: 21 x 18'

 
    '*       Outdoor1'
    '*       SNR Vs test No'

    'Table data size: 20 x 18'

 
    '*       Outdoor2'
    '*       SNR Vs test No'

    'Table data size: 23 x 3'

 
    '*       Outdoor3'
    '*       SNR Vs test No'

    'Table data size: 22 x 18'

 
    '*       Outdoor4'
    '*       SNR Vs test No'

    'Table data size: 21 x 18'

 
    '*       Outdoor5'
    '*       SNR Vs test No'

    'Table data size: 18 x 5'

 

テキスト ファイルを閉じる

fclose(fid);

ブロックの数

ブロックはどのくらいありましたか。

NrOfBlocks = Block-1
NrOfBlocks =

    17

データの確認

1 つのブロックの数値データを見てみましょう。

Block = 9;

% Headers and Data
disp(HeaderLines{Block});
disp(sprintf('SNR        %d        %d',Data{Block,1}(1,2:end)))

user_format = get(0, 'format');
format short e % Use exponential format

disp(' ');
disp(Data{Block,1}(2:end,2:end));
set(0, 'format', user_format);
    '*       Indoor0'
    '*       SNR Vs test No'

SNR        -7        -6
 
   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

この情報は役に立ちましたか?