Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Importar archivos de datos de texto con e/s de bajo nivel

Visión general

permiten el máximo control sobre la lectura o la escritura de datos en un archivo.Low-level file I/O functions Sin embargo, estas funciones requieren que especifique información más detallada sobre el archivo que la más fácil de usar, como.high-level functionsimportdata Para obtener más información sobre las funciones de alto nivel que leen archivos de texto, consulte.Formas de importar archivos de texto

Si las funciones de alto nivel no pueden importar los datos, utilice una de las siguientes opciones:

Para obtener información adicional, consulte:

Nota

Las funciones de e/s de archivo de bajo nivel se basan en funciones de la biblioteca de C estándar.ANSI® Sin embargo, incluye versiones de las funciones, para leer y escribir datos en una matriz con bucles de control mínimos.MATLAB®vectorized

Leer datos en un patrón formateado

Para importar archivos de texto que no puedan leerse, considere la posibilidad de usarlos.importdatatextscanfscanf La función requiere que describa el formato de su archivo, pero incluye muchas opciones para esta descripción de formato.fscanf

Por ejemplo, cree un archivo de texto como se muestra.mymeas.dat Los datos en incluyen conjuntos repetidos de tiempos, fechas y mediciones.mymeas.dat El texto de cabecera incluye el número de conjuntos de mediciones:N

Measurement Data N=3  12:00:00 01-Jan-1977 4.21  6.55  6.78  6.55 9.15  0.35  7.57  NaN 7.92  8.49  7.43  7.06 9.59  9.33  3.92  0.31 09:10:02 23-Aug-1990 2.76  6.94  4.38  1.86 0.46  3.17  NaN   4.89 0.97  9.50  7.65  4.45 8.23  0.34  7.95  6.46 15:03:40 15-Apr-2003 7.09  6.55  9.59  7.51 7.54  1.62  3.40  2.55 NaN   1.19  5.85  5.05 6.79  4.98  2.23  6.99

Abrir el archivo

Al igual que con cualquiera de las funciones de e/s de bajo nivel, antes de leer, abra el archivo con y obtenga un identificador de archivo.fopen De forma predeterminada, abre los archivos para el acceso de lectura, con un permiso de.fopen'r'

Cuando termine de procesar el archivo, ciérrelo confclose(fid).

La descripción de los datos

Describir los datos del archivo con especificadores de formato, por ejemplo, para texto, para un entero o para un número de punto flotante.'%s''%d''%f' (Para obtener una lista completa de los especificadores, consulte la página de referencia.)fscanf

Para omitir caracteres literales en el archivo, incluirlos en la descripción del formato. Para omitir un campo de datos, utilice un asterisco () en el especificador.'*'

Por ejemplo, considere las líneas de encabezado de:mymeas.dat

Measurement Data   % skip the first 2 words, go to next line:  %*s %*s\n N=3                % ignore 'N=', read integer:  N=%d\n                    % go to next line:  \n 12:00:00 01-Jan-1977 4.21  6.55  6.78  6.55 ...

Para leer los encabezados y devolver el valor único de:N

N = fscanf(fid, '%*s %*s\nN=%d\n\n', 1); 

Especificando el número de valores a leer

De forma predeterminada, vuelve a aplicar la descripción del formato hasta que no puede coincidir con la descripción de los datos o llega al final del archivo.fscanf

Opcionalmente, especifique el número de valores que desea leer, de modo que no intente leer todo el archivo.fscanf Por ejemplo, en cada conjunto de mediciones se incluye un número fijo de filas y columnas:mymeas.dat

measrows = 4; meascols = 4; meas  = fscanf(fid, '%f', [measrows, meascols])'; 

Creación de variables en el espacio de trabajo

Hay varias formas de almacenar en el área de trabajo.mymeas.datMATLAB En este caso, lea los valores en una estructura. Cada elemento de la estructura tiene tres campos:,, y.mtimemdatemeas

Nota

rellena matrices con valores numéricos en orden de columnas.fscanf Para hacer que la matriz de salida coincida con la orientación de los datos numéricos en un archivo, transponer la matriz.

filename = 'mymeas.dat'; measrows = 4; meascols = 4;  % open the file fid = fopen(filename);  % read the file headers, find N (one value) N = fscanf(fid, '%*s %*s\nN=%d\n\n', 1);  % read each set of measurements for n = 1:N     mystruct(n).mtime = fscanf(fid, '%s', 1);     mystruct(n).mdate = fscanf(fid, '%s', 1);      % fscanf fills the array in column order,     % so transpose the results     mystruct(n).meas  = ...       fscanf(fid, '%f', [measrows, meascols])'; end  % close the file fclose(fid);

Lectura de datos línea por línea

proporciona dos funciones que leen las líneas de los archivos y las almacenan como vectores de caracteres: y.MATLABfgetlfgets La función copia la línea junto con el carácter de nueva línea a la salida, pero no lo hace.fgetsfgetl

En el ejemplo siguiente se utiliza para leer un archivo completo de una línea a la vez.fgetl La función determina si aparece una secuencia de caracteres determinada () en cada línea.litcountliteral Si lo hace, la función imprime toda la línea precedida por el número de veces que el literal aparece en la línea.

function y = litcount(filename, literal) % Count the number of times a given literal appears in each line.  fid = fopen(filename); y = 0; tline = fgetl(fid); while ischar(tline)    matches = strfind(tline, literal);    num = length(matches);    if num > 0       y = y + num;       fprintf(1,'%d:%s\n',num,tline);    end    tline = fgetl(fid); end fclose(fid);

Cree un archivo de datos de entrada llamado:badpoem

Oranges and lemons, Pineapples and tea. Orangutans and monkeys, Dragonflys or fleas.

Para averiguar cuántas veces aparece en este archivo, llame al:'an'litcount

litcount('badpoem','an') 

Esto devuelve:

2: Oranges and lemons, 1: Pineapples and tea. 3: Orangutans and monkeys, ans =      6

Comprobación de fin de archivo (EOF)

Al leer una parte de los datos a la vez, puede usar para comprobar si ha llegado al final del archivo. Devuelve un valor de cuando el puntero de archivo está al final del archivo.feoffeof1 De lo contrario, devuelve.0

Nota

Abrir un archivo vacío mueve el indicador de posición del archivo al final del archivo.not Las operaciones de lectura, y las funciones, mueven el indicador de posición del archivo.fseekfrewind

Pruebas de EOF con feof

Cuando utilice, o para leer porciones de datos a la vez, utilice para comprobar si ha llegado al final del archivo.textscanfscanffreadfeof

Por ejemplo, supongamos que el archivo hipotético tiene el siguiente formato, sin información sobre el número de conjuntos de medidas.mymeas.dat Lea los datos en una estructura con campos para, y:mtimemdatemeas

12:00:00 01-Jan-1977 4.21  6.55  6.78  6.55 9.15  0.35  7.57  NaN 7.92  8.49  7.43  7.06 9.59  9.33  3.92  0.31 09:10:02 23-Aug-1990 2.76  6.94  4.38  1.86 0.46  3.17  NaN   4.89 0.97  9.50  7.65  4.45 8.23  0.34  7.95  6.46 

Para leer el archivo:

filename = 'mymeas.dat'; measrows = 4; meascols = 4;  % open the file fid = fopen(filename);  % make sure the file is not empty finfo = dir(filename); fsize = finfo.bytes;  if fsize > 0       % read the file     block = 1;     while ~feof(fid)         mystruct(block).mtime = fscanf(fid, '%s', 1);         mystruct(block).mdate = fscanf(fid, '%s', 1);          % fscanf fills the array in column order,         % so transpose the results         mystruct(block).meas  = ...           fscanf(fid, '%f', [measrows, meascols])';          block = block + 1;     end  end  % close the file fclose(fid);

Las pruebas de EOF con fgetl y fgets

Si utiliza o en un bucle de control, no siempre es la mejor manera de probar para el final del archivo.fgetlfgetsfeof Como alternativa, considere la posibilidad de comprobar si el valor que o devuelve es un vector de caracteres.fgetlfgets

Por ejemplo, la función descrita en incluye el siguiente bucle y llamadas:litcountLectura de datos línea por líneawhilefgetl

y = 0; tline = fgetl(fid); while ischar(tline)    matches = strfind(tline, literal);    num = length(matches);    if num > 0       y = y + num;       fprintf(1,'%d:%s\n',num,tline);    end    tline = fgetl(fid); end

Este enfoque es más robusto que las pruebas por dos razones:~feof(fid)

  • Si o encuentra datos, devuelven un vector de caracteres.fgetlfgets De lo contrario, devuelven un número ().-1

  • Después de cada operación de lectura, y compruebe el siguiente carácter en el archivo para el marcador de fin de archivo.fgetlfgets Por lo tanto, estas funciones a veces establecen el indicador de fin de archivo del que devuelven un valor.before-1 Por ejemplo, considere el siguiente archivo de texto de tres líneas. Cada una de las dos primeras líneas finaliza con un carácter de nueva línea y la tercera línea solo contiene el marcador de fin de archivo:

    123 456 

    Tres llamadas secuenciales para producir los siguientes resultados:fgetl

    t1 = fgetl(fid);    % t1 = '123', feof(fid) = false t2 = fgetl(fid);    % t2 = '456', feof(fid) = true t3 = fgetl(fid);    % t3 = -1,    feof(fid) = true 

    Este comportamiento no se ajusta a las especificaciones de las funciones del lenguaje C relacionadas.ANSI

Abrir archivos con diferentes codificaciones de caracteres

admiten los caracteres requeridos para alfabetos concretos, como los de idiomas japoneses o europeos.Encoding schemes Los esquemas de codificación comunes incluyen US-ASCII o UTF-8.

Si no especifica un esquema de codificación, abre los archivos para su procesamiento utilizando la codificación predeterminada para el sistema.fopen Para determinar el valor predeterminado, abra un archivo y vuelva a llamar con la sintaxis:fopen

[filename, permission, machineformat, encoding] = fopen(fid);

Si especifica un esquema de codificación al abrir un archivo, las siguientes funciones aplican ese esquema:,,,, y.fscanffprintffgetlfgetsfreadfwrite

Para obtener una lista completa de los esquemas de codificación admitidos y la sintaxis para especificar la codificación, consulte la página de referencia.fopen