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