Main Content

Importar un bloque de datos numéricos de un archivo de texto

Este ejemplo muestra cómo leer datos numéricos organizados en bloques en un archivo de texto. Cada bloque dentro del archivo puede tener un formato diferente. Puede leer todos los bloques como arreglos de celdas, un bloque cada vez, usando textscan.

Visión general del formato de archivo

La información del archivo de texto de muestra, test80211.txt, es el resultado de una prueba de la calidad de la comunicación de una red inalámbrica. El archivo de muestra consta de cuatro líneas de introducción seguidas de varios bloques de datos. Cada bloque representa un entorno diferente (por ejemplo, móvil, interior, exterior) y tiene el siguiente formato:

  • Dos líneas de encabezado de descripción

  • El texto, Num SNR=, seguido de un valor numérico, m

  • Datos numéricos organizados en una tabla de m columnas y un número arbitrario de filas (los datos están delimitados por comas).

  • El texto, *EOB, que denota el final del bloque

Por ejemplo, un bloque de datos tiene el siguiente formato:

* 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

Los datos numéricos representan las tasas de error en una gama de niveles de ruido para una serie de pruebas independientes. La primera columna indica el número de la prueba. Para ver todo el archivo de muestra, escriba en la línea de comandos:

open test80211.txt

Abrir un archivo de texto para su lectura

Abra el archivo y cree un identificador de archivo.

fileID = fopen('test80211.txt','r');

Leer líneas de introducción

Lea las cuatro líneas introductorias, que contienen el texto delimitado por un carácter de nueva línea. textscan devuelve un arreglo de celdas 1 por 1 que contiene un arreglo de celdas 4 por 1 de vectores de caracteres.

Intro = textscan(fileID,'%s',4,'Delimiter','\n')
Intro = 1x1 cell array
    {4x1 cell}

Vea el contenido de la primera celda.

disp(Intro{1})
    {'*CCX'                      }
    {'*CCX WiFi conformance test'}
    {'*CCX BER Results'          }
    {'*CCX'                      }

Leer cada bloque

Para cada bloque, queremos leer un encabezado, el valor numérico m, los encabezados de las columnas de los datos y luego los propios datos. Primero, inicie el índice de bloque.

Block = 1;

Lea cada bloque de datos en un bucle while. El bucle se ejecuta hasta que se alcanza el final del archivo y ~feof devuelve false. La función textscan devuelve los datos de cada bloque como un arreglo de celdas llamado InputText. Convierta cada arreglo de celdas en un arreglo numérico usando cell2mat y almacene el arreglo numérico en un arreglo de celdas llamado Data. Un arreglo de celdas permite el almacenamiento de bloques de tamaños diferentes.

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'}
 

Cerrar un archivo de texto

fclose(fileID);

Número total de bloques

Determine el número de bloques del archivo.

NumBlocks = Block-1
NumBlocks = 17

Ver datos numéricos

Muestre los datos numéricos en uno de los bloques utilizando notación científica abreviada.

Primero, almacene el formato de visualización de salida de la ventana de comandos actual.

user_format = get(0, 'format');

Cambie el formato de visualización a una notación científica abreviada.

format shortE

Muestre las líneas de encabezado del noveno bloque y los datos numéricos.

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

Restaure el formato de visualización de salida de la ventana de comandos original.

set(0, 'format', user_format);

Consulte también

Temas relacionados