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