Main Content

从文本文件导入数值数据块

此示例说明如何读取文本文件中以数据块形式组织的数值数据。文件中的每个数据块可以有不同格式。您可以使用 textscan 以元胞数组形式读取所有数据块,一次读取一个。

文件格式概述

示例文本文件 test80211.txt 中的信息是无线网络通信质量测试的结果。该示例文件由四行介绍和后续的几个数据块组成。每个数据块代表一个不同环境(例如,移动、室内、室外),并具有以下格式:

  • 开头的两行说明文字

  • 文本 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

打开要读取的文本文件

打开文件并创建一个文件标识符。

fileID = fopen('test80211.txt','r');

读取简介行

读取四个简介行,其中包含由换行符分隔的文本。textscan 返回一个 1×1 元胞数组,其中包含一个 4×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 返回 falsetextscan 函数以名为 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

显示第九个数据块的标题行和数值数据。

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);

另请参阅

相关主题