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