В этом примере показано, как считывать числовые данные, упорядоченные по блокам в текстовом файле. Каждый блок в файле может иметь свой формат. Все блоки можно считывать как массивы ячеек по одному, используя textscan.
Информация в текстовом файле образца, test80211.txt, является результатом теста качества связи беспроводной сети. Образец файла состоит из четырех строк введения, за которыми следует несколько блоков данных. Каждый блок представляет различную среду (например, мобильную, внутреннюю, наружную) и имеет следующий формат:
Две строки описания заголовка
Текст, Num SNR=, за которым следует числовое значение, m
Числовые данные, упорядоченные в таблице m столбцы и произвольное количество строк (данные разделяются запятыми).
Текст, *EOB, обозначающий конец блока
Например, блок данных имеет следующий формат:
* Indoor2
* Номер теста SNR Vs
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 прибыль false. 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Просмотрите строки заголовка для девятого блока и числовые данные.
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);