Lo que he aprendido: leer datos de archivos de texto en Matlab

Hoy os voy a hablar de otra manera en la que podemos leer datos de un archivo de texto en Matlab para luego usar sus valores numéricos. Estoy pensando en los archivos que nos genera el típico software de gestionar sensores, que suelen dar más guerra que ni sé. Para mí los problemas suelen ser:

  • La cabecera: o bien la quito a mano si son pocos archivos (un par) y uso load o saco los datos con una expresión regular

  • El formato: a veces estos cacharros tienen la manía de guardar los datos con comas en lugar de puntos, lo que te la organiza y te obliga a preprocesar el texto antes de importarlo. Esto es una liada galática cuando muestreamos a frecuencia alta y nuestros archivos pesan mucho (nivel bloquear el Notepad), en este caso mi opción favorita es el M-x replace-string de Emacs.

Pues bien, con la función textscan de Matlab y un par de lambdas podemos solventar los problemillas y de paso escribir un código que solo los expertor podrán entender 😉

Lo que quería en este caso era importar un archivo de texto de cinco columnas, en el que cada columna representa una variable. La primera línea es la cabecera y no la necesito. Además, por algún motivo los decimales están puestos con coma en lugar de punto.

Lo que tenemos que hacer es:

  1. Abrir el archivo, para ello usaremos el archiconocido fopen
  2. Pasarle el texto a textscan diciéndole cuál es el formato de cada línea. En nuesto caso no va a reconocer los números con coma como número, así que los leeremos como string. El separador por defecto es el espacio en blanco, así que no necesito añadirle nada más aparte de número de líneas de la cabecera, en otro caso tendríamos que usar la opción 'Delimiter' con el separador en cuestión.

  3. Cerrar el archivo

  4. Sustituir la coma por punto. Como textscan genera cells, usamos una lambda para que nos aplique un buscar y reemplazar en todos los elementos

  5. Pasar los datos de string a número, también podemos usar una lambda para esto

  6. Separar el contenido de la cell en los vectores que nos hagan falta

Que todo junto queda:

%%%%%%%%%%%%%% Importar y tratar texto  %%%%%%%%%%%%%%%%%%%%%%

% Leer

fid = fopen(file, 'rt'); % opción rt para abrir en modo texto
formato = '%s %s %s %s %s'; % formato de cada línea 
data = textscan(fid, formato, 'HeaderLines', 1);
fclose(fid); 

% Sustituir coma por punto

data = cellfun(@(x) strrep(x,',','.'), data, 'UniformOutput', false);

% Convertir a vector numérico

a = cell2mat(cellfun(@str2num, data{1}, 'UniformOutput', false));

Como véis corto y eficaz. Es un poco lío por el tema de las cell, que yo al menos no las entiendo, pero bueno ¡espero que os sea útil! 🙂

Anuncios

Un pensamiento en “Lo que he aprendido: leer datos de archivos de texto en Matlab

  1. Pingback: Compilación: Matlab | Onda Hostil

¡Opina sin miedo! (Puedes usar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s