Expresiones regulares con Ruby

El otro día me pusieron un reto programático bastante interesante. Me dieron un archivo de texto del cual tenía que extraer ciertos datos y entregarlos en un archivo de Excel. ¡Interesante! ¿No creen?.

Al principio intenté con un programa que fuera libre o gratuito, algún editor que buscara información de archivos de texto para luego entregarlos en otro diferente, pero no fue tan sencillo.

El archivo de texto que me entregaron no tenía un formato más o menos constante e implicaba varios retos, lo siguiente que se me ocurrió fue hacer un script.

Un amigo me sugirió que usara Perl, pero para ser sincero no estoy familiarizado con este lenguaje así que sería un volver a empezar. Así que mi siguiente opción fue la de utilizar Ruby que es un lenguaje que me agrada y más o menos le entiendo.

Ruby al rescate

Para este problema decidí dividir las tareas principales, cargar el archivo de texto en un arreglo, mi idioma iniciar la búsqueda de la información, guardar esa información en otro arreglo (array) o en un hash para luego vaciarlo a un archivo de texto separado por pipes( | ).

Como es mi primer contacto con Expresiones regulares necesité un poco de ayuda.

El sitio txt2re ayuda a seleccionar ese patrón que quieres extraer y además te hace un ejemplo en varios lenguajes como Perl, PHP, Python, Java, C, C++ y claro Ruby. Este sitio fue un buen comienzo, sin embargo, con un poco de práctica pude simplificar mucho el script.

txt2re
El sitio txt2re permite juguetear un poco con las expresiones regulares.

Otro tutorial que me ayudó mucho fue Aprende a Programar con Ruby. Esta muy bien explicado, en español y repleto de ejemplos que explican claramente cada tema. Si están empezando a programar en Ruby debes de tenerlo en cuenta.

Aprende a Programar con Ruby
Si no estas familiarizado con Ruby, lo mejor es darle un vistazo a este tutorial.

Y como tumbaburros de la enorme cantidad de clases y métodos que tiene Ruby les recomiendo el sitio DevDocs Ruby.

DevDocs Ruby
Como guía rápida de Clases y Métodos de Ruby.

Ahora si, como dice «Jack el destripador» ¡Vámonos por partes!.

Cargar un archivo a un arreglo.

Esto es importante, al momento de programar es mucho más sencillo manipular un arreglo que un archivo. Una de las razones por las que me gusta Ruby es que simplifica mucho las tareas, hacer esto es algo que toma solamente dos líneas:

archivo = File.new("archivo.txt","r")
txt = archivo.readlines

Y todo el contenido del archivo se guarda en arreglo de nombre txt línea por línea, por ejemplo, si quiero leer la primer línea del archivo hago referencia de esta forma txt[0] (los índices de los arreglos comienzan en cero) y así hasta el final del archivo.

Expresiones regulares en ruby.

Ahora viene lo realmente complicado, para aplicar una expresión regular voy a usar el método match, por ejemplo:

num = /\d{6}/.match(txt[0])

La expresión regular

/\d{6}/

busca un patrón de 6 digitos seguidos y num guarda un valor de cierto o falso, cierto si encuentra la expresión regular en el texto analizado y falso si no lo encuentra.

num =/\d{6}/.match("12345 Regresa False")
num =/\d{6}/.match("123456 Regresa True")

Pero eso solo nos dice si encontró o no la expresión regular, el valor de lo que encontró lo podemos revisar en el índice cero de la variable.

puts num[0] #regresa 123456

Búsquedas indirectas

Ahora viene algo interesante, a veces no me interesa tanto la expresión regular, si no lo que está a la derecha de ella. Por ejemplo la clásica combinación clave descripción. Se que la descripción está a la derecha de la clave.

texto = "000001 Manjaro Linux 0.9.9 xfce CD de Instalación"
num = /\d{6}/.match(texto)
if num #Revisa si encontró la expresión regular.
    descripcion = texto[8,42] #Si la encuentra regresa lo que esta a derecha del número.
    puts descripcion
end

Extraer una parte de un texto en Ruby es sencillo, en donde dice texto[8,42] quiere decir que a partir de la posición 8 toma los 42 caracteres de la derecha, por lo tanto el contenido de la variable descripcion es:

"Manjaro Linux 0.9.9 xfce CD de Instalación"

Como ven esto apenas es un esbozo de todo lo que se puede realizar con expresiones regulares con Ruby, espero que les sea de utilidad.

Enlaces de interés.

¡Me encantaría saber que opinas!

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.