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]