exponenta event banner

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

В этом примере показано, как считывать числовые данные, упорядоченные по блокам в текстовом файле. Каждый блок в файле может иметь свой формат. Все блоки можно считывать как массивы ячеек по одному, используя textscan.

Обзор формата файла

Информация в текстовом файле образца, test80211.txt, является результатом теста качества связи беспроводной сети. Образец файла состоит из четырех строк введения, за которыми следует несколько блоков данных. Каждый блок представляет различную среду (например, мобильную, внутреннюю, наружную) и имеет следующий формат:

  • Две строки описания заголовка

  • Текст, Num SNR=, за которым следует числовое значение, m

  • Числовые данные, упорядоченные в таблице m столбцы и произвольное количество строк (данные разделяются запятыми).

  • Текст, *EOB, обозначающий конец блока

Например, блок данных имеет следующий формат:

* Indoor2

* Номер теста SNR Vs

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

Просмотр числовых данных

Отображение числовых данных в одном из блоков с помощью краткой научной записи.

Сначала сохраните текущий формат отображения выходных данных окна команд.

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

Восстановите исходный формат отображения выходных данных окна команд.

set(0, 'format', user_format);

См. также

Связанные темы