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

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

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

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

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

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

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

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

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

* Indoor2

* ОСШ Vs тест Нет

Num ОСШ = 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. The 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);

См. также

Похожие темы