domingo, 11 de enero de 2009

Rapidamente: como extraer los emails de un documento sin formato específico

Me han entregado una serie de documentos que contienen emails, no tienen un formato definido, pueden estar en MS -Word, texto o en hoja electrónica, la tarea encomendada es extraer todas las direcciones electrónicas de dichos documentos.

Lo solución es en base a expresiones regulares.

Una sola expresión regular será suficiente para cumplir la tarea: [A-Za-z0-9._%+-]+@([A-Za-z0-9_+-]+\.)+[A-Za-z0-9]{2,4}. Esta nos permitirá extraer todos y cada unos de los emails de cualquier documento.

Para el efecto me planteo los siguientes pasos:

  1. Todos los documentos fuentes los dejo en formato de texto, no me preocupa su contenido.
  2. Leo cada línea de los archivos texto, de donde extraigo los emails utilizando el patron anterior.
  3. Cada email recuperado se agrega a un arreglo.
  4. El arreglo es ordenado alfabéticamente.
  5. Se eliminan los duplicados.
  6. Se imprime la lista.

El programa en groovy es muy corto:

  1 def emails = []
  2 new File(args[0]).eachLine {
  3     it.eachMatch(/[A-Za-z0-9._%+-]+@([A-Za-z0-9_+-]+\.)+[A-Za-z0-9]{2,4}/) {
  4         emails << it[0]
  5     }
  6 }
  7 println emails.sort().unique()

donde:

emails es el arreglo que almacenará cada email recuperado.

new File(args[0]).eachLine hace dos cosas: habre el archivo y lee cada linea.

it.eachMatch(...) extrae cada email según la expresion regular, que es almacenado con la expresion emails << it[0]

println emails.sort().unique() ordena, elimina los duplicados y luego imprime la lista de emails resultantes.

Este scripts lo podemos guardar en un archivo de nombre emails.groovy, y su ejecución desde la linea de comandos:

groovy emails.groovy archivo.txt

donde archivo.txt es el nombre del archivo texto que contiene los emails. Al ejecutarse este programa, el nobre del archivo es recogido en la variable dinámica args[0]

2 comentarios:

Anónimo dijo...

Interesante técnica. Esto me recuerda un proyecto en el trabajé hace casi 8 años (vaya, que rápido que pasa el tiempo). La idea en ese entonces era extraer un listado de emails e información de contacto de una serie de enormes archivos de correo inaccesibles extraidos de una Mac.

Recuerdo que en ese entonces utilice un programa en C con Flex y Bison. Interesante ejercicio.

El resultado fue utilizado en campañas de marketing por Internet y encuestas de satisfacción en línea.

Vaya que tiempos aquellos... lol.
Mis inicios en el Análisis Web.

Saludos,

José Luis

J Salvador dijo...

si, efectivamente la técnica es intersante: combina la potencialidad del lenguaje dinámico Groovy con las expresiones regulares