viernes, 5 de septiembre de 2008

Completa tu agenda!

El otro día vimos un script que había creado que era capaz de indicarnos la zona aproximada desde la que se había realizado una llamada a partir de un teléfono fijo (basándonos en el número de teléfono).

Ese script establecía una relación directa entre un número de teléfono y un código postal, y me pregunté yo: "por qué en mi agenda no tengo ni un sólo código postal?". Es común tener en nuestra agenda el nombre de nuestros contactos y su número de teléfono. En menor medida tenemos la dirección o el código portal.

El código postal, aunque subestimado por algunos (va por tí XD, Nerimm XD), es un buen indicador geográfico. En ciudades grandes nos dice en qué barrios residen nuestros contactos, y en caso de pueblos pequeños, nos da una idea de en qué zona están esos pueblos.

El script que he realizado, y voy a enseñaros a continuación, es capaz de añadir de golpe todos los códigos postales de los contactos españoles que encuentre en vuestra agenda. Para ello, partiremos de un archivo con los datos de vuestros contactos en formato vCard 3.0, (.vcf) un formato bastante común. El script se encargará de:
  • Pediros dónde encontrar el archivo de contactos.
  • Particionar ese archivo separando cada uno de los contactos.
  • Localizar el primer número de teléfono fijo que aparezca para cada contacto.
  • Buscar el código postal asociado a dicho número de teléfono.
  • Localizar en la ficha de cada contacto si ya tenía el código postal, y en caso contrario incluir el localizado.
  • Unir todas las fichas individuales para generar una nueva agenda (en formato vCard 3.0 - .vcf) con la misma información que antes, pero con los códigos postales añadidos.

(Pinchar sobre la imagen para agrandar)

Para que la cosa funcione, como advierte el script, es necesario que los contactos tengan completados algunos campos:
  • Número de teléfono: Debe ser un número de teléfono fijo nacional.
  • País: "Spain" o "España"
Si no se cumple alguno de estos dos requisitos, o si no se encuentra información sobre el usuario, no se alterará la información del archivo original (no perdemos datos, simplemente no se añade nada nuevo).

También es necesario tener conexión a Internet en el momento de ejecutarlo, puesto que la relación entre número telefónico y código postal la hace analizando el contenido de una página web.


Código
(Descargar script: addcp.sh)

#!/bin/bash
zenity --info --title="ADDCP" --text="\t\tBIENVENIDOS A ADDCP\n\t\t****************************\n\n Este programa intentará completar la información sobre la dirección de sus contactos basándose en los teléfonos fijos que encuentre.\n\n Realizado por Astaroth (O.R.G.)\n http://astarothsworld.blogspot.com"
zenity --warning --title="ADDCP - Copia de seguridad y Funcionamiento" --text="Este script no altera la agenda original, sino que trabaja sobre una copia llamada agendamodificada.vcf, tenga cuidado de que no exista ningún archivo con el mismo nombre en la carpeta donde lo ejecuta. \n\n El modo de funcionar de este script se basa en que su agenda esté parcialmente completada. En concreto, será necesario que los contactos tengan relleno el campo de país como Spain o España y algún número de teléfono fijo.\n\n Se requiere conexión a Internet."
zenity --info --title="ADDCP - Seleccionar Agenda" --text="Indíquenos, por favor, dónde está su agenda (en formato vCard 3.0)"
ab=`zenity --file-selection --title="ADDCP - Seleccionar Agenda" --text="Seleccione el archivo vCard 3.0 de su agenda:"`
dir=$pwd
mkdir .tempag
grep -n "BEGIN" $ab | grep -o [0-9]* > .tempag/ini.txt
grep -n [0-9] .tempag/ini.txt | gawk '{print $1 ; FS=":"}' > .tempag/numc.txt
grep -n END $ab | gawk -F: '{print $1}' > .tempag/fin.txt
mnp () { e=`echo "$1""p"`
sed -n $e $2
}
k=1
e=`echo '\$''p'`
i=`sed -n $e .tempag/numc.txt`
j=1
paso=`echo "scale=2 ; 100 / $i" | bc`
porc=0
(while [ $j -le $i ] ; do
echo "$porc"
echo "# Individualizando contacto #$j"
p=`mnp $j .tempag/ini.txt`
k=`expr $j + 1`
if [ $k -gt $i ] ; then
e=`echo "\$""p"`
f=`sed -n $e .tempag/fin.txt`
else
f=`mnp $k .tempag/ini.txt`
f=`expr $f - 1`
fi
e=`echo "$p,$f""p"`
sed -n $e $ab > .tempag/Contacto$j.txt
porc=`echo "scale=2 ; $porc + $paso" | bc`
j=$k
done) | zenity --progress --title="ADDCP - Separando Contactos" --text="Pensando..." --auto-close -- auto-kill
(for j in $(seq $i) ; do
echo "$proc"
echo "# Buscando código postal del contacto #$j..."
num=`grep -o -m 1 "9[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]" .tempag/Contacto$j.txt`
w3m http://www.infobel.com/es/spain/inverse.aspx\?qPhone\=$num\&amp\;SubmitREV\=Buscar\&amp\;inphCoordType\=EPSG > .tempag/$num.txt
cp=`grep -o "[0-9][0-9][0-9][0-9][0-9]" .tempag/$num.txt | sed '1d ; 3d'`
sed 's/;;Spain/;'$cp';Spain/g' .tempag/Contacto$j.txt > .tempag/C$j.txt
sed 's/;;España/;'$cp';España/g' .tempag/C$j.txt >> agendamodificada.vcf
porc=`echo "scale=2 ; $porc + $paso" | bc`
done) | zenity --progress --title="ADDCP - Procesando..." --text="Pensando..." --auto-close -- auto-kill
rm -R .tempag
zenity --info --title="ADDCP - Finalizado" --text="El proceso de adicción de códigos postales en su agenda ha finalizado.\n\n Gracias por usar este Script ;)\n\n Visita Astaroth\'s World\n http://astarothsworld.blogspot.com"


Bugs conocidos

El proceso de identificar el código postal suele ir bien, sin embargo, hay ocasiones en las que no se encuentra información sobre un contacto, o lo que es más grave, en contadas ocasiones el programa interpreta que el código postal son las cinco primeras cifras del número de teléfono.

Cualquier otro bug que encontréis podéis incluirlo en los comentarios de esta entrada. En cualquier caso, el programa genera una copia de la agenda sobre la que trabaja, se aconseja no borrar el original por si diera algún error.

3 comentarios:

  1. No, subestimado no... Yo sigo diciendo lo mismo, que qué ilusión poder hacer eso xDDDD. QMD, ya lo sé xD.

    ResponderEliminar
  2. XD, nooo... Tienes tanto derecho a permanecer en silencio como cualquier otro XD... digo... a opinar :p, jejeje, pero a mí si me parece curioso saber dónde vive una persona más o menos sólo por su número de teléfono. Contra más información, mejor, la información nunca sobra :p, nunca sabes cuándo vas a necesitarla, y hay información que te lleva a obtener más información... así es más fácil poder localizar una dirección y escribirle una carta, por ejemplo, a un amigo sin arruinar la sorpresa llamándole antes para preguntarle dónde vive :p, pero tendrá millones de aplicaciones más :p!

    Los físicos lo llamamos "completitud" XD. Sum (|i><i|) = 1.

    Además, si les tienes que preguntar a cada uno de los que te dan el teléfono su código postal y luego meterlo en el ordenador, primero te mandan a la mierda y luego te mueres para hacerlo :p. Esto es automático, sin molestar a nadie: ni a ellos ni a tí :p.

    Un besazo Nerimmmmmmmmmm :p! Gracias por tu comentario ;)!

    ResponderEliminar
  3. soberbio post! sí señor!

    no me acaba de quedar claro cómo puedo pasar de un móvil sony mis contactos (.vcf) a otro nokia (éste me da error, formato desconocido...)

    tienen diferentes formatos???

    ResponderEliminar

Querido astarothista!,

Si te ha gustado la entrada y quieres dejar constancia de ello, tienes alguna sugerencia para completarla o corregirla, quieres mostrar tu opinión respecto a algo de lo que se haya hablado en esta entrada (con respeto) o simplemente quieres dejarme un mensaje a mi o a la comunidad, no dudes en comentar ;)!

Recuerda que también estamos en Facebook y en Google+.