Импортируйте блок числовых данных из текстового файла

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

Смотрите также

Похожие темы