В этом примере показано, как считать числовые данные, организованные в блоки в текстовом файле. Каждый блок в файле может иметь другой формат. Можно считать все блоки как массивы ячеек, по одному блоку за раз, используя 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);