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:
- Todos los documentos fuentes los dejo en formato de texto, no me preocupa su contenido.
- Leo cada línea de los archivos texto, de donde extraigo los emails utilizando el patron anterior.
- Cada email recuperado se agrega a un arreglo.
- El arreglo es ordenado alfabéticamente.
- Se eliminan los duplicados.
- 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]