主要内容

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

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

文件格式概述

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

  • 两行标题描述

  • 文本,Num信噪比=,后面跟着一个数值,

  • 的表中组织的数字数据列和任意数量的行(数据以逗号分隔)。

  • 文本,区块,表示块的结束

例如,一个数据块是这样格式化的:

* Indoor2

*信噪比测试号

Num信噪比= 3

-5.00 e + 00 -4.00 e + 00,

1.00 e + 00, 3.32 e-07 9.12 e-07

2.00 e + 00, 1.49 e-07 2.44 e-07

3.00 e + 00, 6.04 e-07 2.53 e-07

4.00 e + 00, 1.53 e-07 4.25 e-07

5.00 e + 00, 1.82 e-07 1.83 e-07

6.00 e + 00, 6.27 e-07 8.21 e-07

7.00 e + 00, 9.10 e-08 1.53 e-08

8.00 e + 00, 8.73 e-07 6.45 e-07

9.00 e + 00, 4.40 e-07 1.33 e-07

*区块

数值数据表示若干独立测试在一定噪声水平范围内的错误率。第一列表示测试编号。要查看整个示例文件,在命令行输入:

打开test80211.txt

打开文本文件以供阅读

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

fileID = fopen(“test80211.txt”“r”);

阅读介绍行

阅读四行介绍,其中包含用换行符分隔的文本。textscan返回一个1 × 1单元格数组,其中包含字符向量的4 × 1单元格数组。

导入= textscan(fileID,' % s '4“分隔符”' \ n '
介绍=1x1单元阵列{4 x1细胞}

查看第一个单元格的内容。

disp(介绍{1})
{'*CCX'} {'*CCX WiFi一致性测试'}{'*CCX BER结果'}{'*CCX'}

读取每个块

对于每个块,我们想要读取一个标头,即数值,数据的列标题,然后是数据本身。首先,初始化块索引。

Block = 1;

读取数据中的每个数据块循环。循环执行,直到到达文件的末尾和~ feof返回.的textscan函数以单元格数组的形式返回每个块中的数据InputText.将每个单元格数组转换为数值数组cell2mat并将数值数组存储在名为数据.单元阵列允许存储不同大小的块。

(~ feof(文件标识)%对于每个块:流(“布洛克:% s \ n”num2str(块))将区块编号打印到屏幕上InputText = textcan (fileID,' % s '2,“分隔符”' \ n ');阅读2个标题行HeaderLines{Block,1} = InputText{1};disp (HeaderLines{块});%显示标题行InputText = textcan (fileID,'Num SNR = %f');读取数值%后面的文字,Num SNR =NumCols = InputText{1};指定这是%的数据列数FormatString = repmat(' % f '1、NumCols);%创建格式字符串%基于数字列百分比InputText = textcan (fileID,FormatString,...读取数据块“分隔符””、“);Data{Block,1} = cell2mat(InputText);[NumRows,NumCols] = size(Data{Block});确定表的大小disp (cellstr (['表数据大小:'...num2str (NumRows)' x 'num2str (NumCols))));disp (' ');%新行eob = textscan(fileID,' % s ', 1“分隔符”' \ n ');读取并丢弃块结束标记方块=方块+1;增量块索引结束
块:1
{'* Mobile1'} {'* SNR Vs测试号'}
{'表数据大小:30 x 19'}

               
块:2
{'* Mobile2'} {'* SNR Vs测试号'}
{'表数据大小:30 x 9'}

               
块:3
{'* Mobile3'} {'* SNR Vs测试号'}
{'表数据大小:31 x 15'}

               
块:4
{'* Mobile4'} {'* SNR Vs测试号'}
{'表数据大小:28 x 19'}

               
布洛克:5
{'* Mobile5'}{'*信噪比测试号'}
{'表数据大小:32 x 18'}

               
布洛克:6
{'* Mobile6'}{'*信噪比测试号'}
{'表数据大小:30 x 19'}

               
布洛克:7
{'* Mobile7'}{'*信噪比测试号'}
{'表数据大小:30 x 11'}

               
布洛克:8
{'* Mobile8'}{'*信噪比测试号'}
{'表数据大小:20 x 18'}

               
布洛克:9
{'* Indoor0'} {'* SNR Vs测试号'}
{'表数据大小:9 x 3'}

               
布洛克:10
{'* Indoor1'} {'* SNR Vs测试号'}
{'表数据大小:22 x 6'}

               
布洛克:11
{'* Indoor2'} {'* SNR Vs测试号'}
{'表数据大小:25 x 3'}

               
布洛克:12
{'* Indoor3'} {'* SNR Vs测试号'}
{'表数据大小:21 x 18'}

               
布洛克:13
{'* Outdoor1'} {'* SNR Vs测试号'}
{'表数据大小:20 x 18'}

               
布洛克:14
{'* Outdoor2'} {'* SNR Vs测试号'}
{'表数据大小:23 x 3'}

               
布洛克:15
{'* Outdoor3'} {'* SNR Vs测试号'}
{'表数据大小:22 x 18'}

               
布洛克:16
{'* Outdoor4'} {'* SNR Vs测试号'}
{'表数据大小:21 x 18'}

               
布洛克:17
{'* Outdoor5'} {'* SNR Vs测试号'}
{'表数据大小:18 x 5'}

               

关闭文本文件

文件关闭(文件标识);

总块数

确定文件中块的数量。

NumBlocks = Block-1
NumBlocks = 17

查看数值数据

使用简短的科学符号在其中一个块中显示数值数据。

首先,存储当前的命令窗口输出显示格式。

User_format = get(0,“格式”);

将显示格式更改为简短的科学符号。

格式shortE

显示第9块的标题行和数字数据。

Block = 9;disp (HeaderLines{块});
{'* Indoor0'} {'* SNR Vs测试号'}
流('SNR %d %d\n',{数据块,1}(1、2:结束)
信噪比-7 -6
disp(数据{块,1}(2:2:末端));
9.0600e-07 6.7100e-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

恢复原来的命令窗口输出显示格式。

集(0,“格式”, user_format);

另请参阅

相关的话题