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