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);