===== 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 puede 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** (**C**omma **S**eparated **V**alues), 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**. **CRLF** viene de **C**arriage **R**eturn - **L**ine **F**eed: el viejo código [[http://es.wikipedia.org/wiki/Ascii|**ASCII**]] para indicar a una impresora que termina una línea y debe ejecutarse la operación de retorno de carro y avance de línea. Bajo **DOS** (y por extensión retrógrada, bajo **Windows**) todos los archivos **ASCII** (o de texto plano) tienen estos dos caracteres de control como fin de línea de texto. O sea que esto ocurre desde la década del 80 hasta nuestros días. Bajo **Linux** (o **Unix** en general) se continúa con la tradición de emplear un simple **LF** (Line Feed) para señalar el fin de una línea de texto en un archivo de texto plano. Esto es así desde los principios de la década del 70, cuando se comenzó el desarrollo de las primeras versiones de **Unix**. 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 líneas en blanco entre línea y línea 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 vuelque a pantalla todo el contenido del archivo y en su lugar se limite a desplegar las primeras líneas (de allí el nombre del comando: head, cabeza o cabecera). 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 líneas en blanco adicionales). Evidentemente todos estos códigos deben ser eliminados y el archivo debe convertirse 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 líneas 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 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 comandos 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 líneas en blanco, lo que equivale a listar todas las líneas que **NO** están en blanco. Para eso buscamos líneas en blanco y con la opción **"-v"** le pedimos el complemento (es decir las líneas que no están en blanco). Una línea en blanco es una línea 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 manera especial de representar eso como una expresión regular: **"^$"** El **"^"** representa comienzo de línea, el **"$"** representa fin de línea, y como no estamos poniendo nada entre medio, es obvio que estamos haciendo referencia a una línea que no contiene nada, una clásica línea 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 notación 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:artículos:artículos técnicos:adquisicion y procesamiento de datos:procesamiento_datos|Procesamiento de los datos y generación de gráficos]]