从文本文件导入数字数据块
此示例演示如何读取文本文件中按块组织的数值数据。文件中的每个块可以有不同的格式。您可以将所有块读取为单元格数组,每次一个块,使用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);