Herramientas de usuario

Herramientas del sitio


Barra lateral

Logo ACEMU

acemu:proyectos:linux:preprocesamiento_datos

¡Esta es una revisión vieja del documento!


Preprocesamiento de los datos

Supongamos que recibimos un archivo con los datos recogidos de un ensayo de motor, por ejemplo, los datos del motor MX001 realizados en 21 de marzo del 2010. El archivo de datos se llama toma_de_datos_acemumx001.csv.

Nota: El lector debe asumir que todas las operaciones que estamos realizando se efectúan dentro de una consola linux o uede ser también una aplicación de terminal

Primero veamos en qué formato recibimos los datos. Más allá de que hayamos exportado los datos en un formato CSV (comma separated values), pueden haber problemas adicionales por la manera que esos datos son almacenados bajo Windows.

Siempre que queramos saber con qué tipo de archivo estamos lidiando, podemos usar el comando file para ver cómo lo identifica Linux:

# file toma_de_datos_acemumx001.csv
toma_de_datos_acemumx001.csv: ASCII text, with CRLF, LF line terminators

Vemos que Linux reconoce el archivo como un archivo ASCII pero terminado en CRLF. <note> CRLF viene de Carriage Return - Line Feed: el viejo código DOS para indicar a una impresora que termina una linea y debe ejecutarse la operación de Retorno de Carro y Avance de Linea.

Bajo DOS (y por extensión retrógrada, bajo Windows) todos los archivos ASCII (o de texto plano) tiene estos dos caracteres de control como fin de linea de texto. O sea que esto ocurre desde la década del 80 hasta nuestros días…

Bajo Linux (o Unix en generl) se continúa con la tradición de Unix de emplear un simple LF (Line Feed) para señalar el fin de una linea de texto en un archivo de texto plano. Esto es así desde los princípios de la década del 70, cuando se comenzó el desarrollo de las primeras versiones de Unix. </note>

Si lo editamos con el procesador de texto vi, vemos lo siguiente:

"Samples per sec. = 60/1"^M

"Ensayo del motor ACEMU_MX#001"^M

""^M

-4.8828E-01,03-21-10,15:38:28^M

-4.6875E-01,03-21-10,15:38:28^M

donde los “^M” corresponden a los CRLF del DOS, y para peor, aparecen lineas en blanco entre linea y linea de datos. Empleando el comando od, podemos indagar un poco más en el formato del archivo:

# od -c toma_de_datos_acemumx001.csv|head

0000000   "   S   a   m   p   l   e   s       p   e   r       s   e   c
0000020   .       =       6   0   /   1   "  \r  \n  \n   "   E   n   s
0000040   a   y   o       d   e   l       m   o   t   o   r       A   C
0000060   E   M   U   _   M   X   #   0   0   1   "  \r  \n  \n   "   "
0000100  \r  \n  \n   -   4   .   8   8   2   8   E   -   0   1   ,   0
0000120   3   -   2   1   -   1   0   ,   1   5   :   3   8   :   2   8
0000140  \r  \n  \n   -   4   .   6   8   7   5   E   -   0   1   ,   0
0000160   3   -   2   1   -   1   0   ,   1   5   :   3   8   :   2   8
0000200  \r  \n  \n   -   4   .   6   8   7   5   E   -   0   1   ,   0
0000220   3   -   2   1   -   1   0   ,   1   5   :   3   8   :   2   8

El “|head” se pone para evitar que el archivo vulque a pantalla todo el contenido del archivo y en su lugar se limite a desplegar las primeras lineas (de allí el nombre head, cabreza o cabecera, del comando).

Comparando con lo que vimos en el editor de textos, identificamos los comandos CRLF como la secuencia “\r\n” y a eso le sigue un “\n” (el LF que genera las lineas en blanco adicionales).

Evidentemente todos estos códigos deben ser eliminados y el archivo debe covnertirse en un simple archivo de texto llano, versión Linux.

Para lograr eso primero usamos el comando dos2unix para convertir los CRLF en simples LF

# dos2unix toma_de_datos_acemumx001.csv

¡Listo!

Ahora tenemos que eliminar las lineas en blanco adicionales, que vaya uno a saber por qué motivo están allí, pero molestan.

Para hacer eso podemos emplear una de las herramientas predilectas de los usuarios linux: grep

El comando grep permite hacer búsquedas búsquedas de texto o expresiones regulares en los archivos de texto y desplegar en pantalla el resultado de esa búsqueda. Éste es uno de los comando que podríamos calificar como pertenciente al kit fundamental de herramientas de linux, por la sencillez a la vez que potencia y flexibilidad que tiene.

En nuestro caso lo que queremos es eliminar todas las lineas en blanco, lo que equivale a listar todas las lineas que no están en blanco. Para eso buscamos lineas en blanco y con la opción “-v” le pedimos el complemento (es decir las lineas que no están en blanco.

Una linea en blanco es una linea que comienza y termina y no contiene nada en su interior. Es el equivalente a la secuencia '\n\n', es decir dos LF seguidos.

Hay una manea especial de representar eso como una expresión regular: “^$”

El “^” representa comienzo de linea, el “$” representa fin de linea, y como no estamos poniendo nada entre medio, es obvio que estamos haciendo referencia a una linea que no contiene nada, una clálsica linea en blanco (ojo, si hubieran espacios en blanco o tabuladores la historia es otra)-

Así que ejecutamos el comando

# grep -v "^$" toma_de_datos_acemumx001.csv >data.csv

El comando grep por defecto vuelca el resultado en la consola (salida estándar), para evitar eso y dirigir la salida a un archivo, le ponemos el operador redireccionamiento “>” volcando el contenido al archivo data.csv.

Si ahora miramos el contenido de dat.csv con el comando head, observamos algo así:

# head data.csv
"Samples per sec. = 60/1"
"Ensayo del motor ACEMU_MX#001"
""
-4.8828E-01,03-21-10,15:38:28
-4.6875E-01,03-21-10,15:38:28
-4.6875E-01,03-21-10,15:38:28
-4.8828E-01,03-21-10,15:38:28
-4.8828E-01,03-21-10,15:38:28
-4.8828E-01,03-21-10,15:38:28

Vemos que el resultado de estas operaciones nos ha dado un archivo limpio que tiene el formato y los datos que esperamos encontrar en un archivo CSV. Observamos en particular que los datos en sí corresponden a 3 columnas: voltaje (en notacion científica), fecha y hora (con una resolución de segundos, algo bastante patético), separados entre sí por comas (de allí el nombre del formato CSV).

Ahora tenemos el archivo en un formato adecuado para comenzar a procesar los datos propiamente dichos. Eso lo veremos en el siguiente artículo.

acemu/proyectos/linux/preprocesamiento_datos.1269986419.txt.gz · Última modificación: 2010/03/30 15:00 por kenneth