miércoles, 8 de octubre de 2008

Una Agenda Apretada

Esta entrada es para enseñaros un sencillo script que he hecho para pasar de un archivo ASCII (.asc) con datos de agenda a un archivo vCard 3.0 (.vcf), que es un formato bastante extendido que puede ser leido directamente por cualquier administrador de contactos, como el KAddressbook en Linux o el MS Outlook.

La idea es tener una base de datos en formato ASCII, como la generada por el programa Infobel España Office. Por ejemplo, supongamos que queremos añadir a nuestra agenda los abogados españoles, que podemos tener por cualquier método en un archivo ASCII, por ejemplo, porque lo hayamos exportado desde Infobel (muestro sólo los primeros resultados):

"Apellido";"Dirección";"Código postal";"Ciudad";"Provincia";"Teléfono";"Fax";"Móvil";"E-mail";"URL";"Actividad"
"08 EUROCONSELL ECONOMIC LEGAL S.C.C.L. ";"P. Claris, 162";"08037";"Barcelona";"BARCELONA";"+34 934.873.947";"";"";"";"";"014101 - ABOGADOS"
"1980 Consultors Legals S.L. ";"Fatxo, 5";"03202";"Elche";"ALICANTE";"+34 965.421.422";"";"";"";"";"014101 - ABOGADOS"
"2000 Alfisa S.L. ";"Cra. Prats Lluçanes, 84";"08208";"Sabadell";"BARCELONA";"+34 937.234.012";"";"";"";"";"014101 - ABOGADOS"
"25 Horas C.B. ";"Desvio Distante, s/n";"14001";"Cordoba";"CÓRDOBA";"+34 957.487.748";"";"";"";"";"014101 - ABOGADOS"


Una vez que tengamos un archivo como el de arriba (con las líneas que sean),, al que vamos a llamar "abogados.asc", por ejemplo, ejecutamos este programa (estando en el directorio donde esté el archivo):

./asc2vcard.sh abogados.asc abogados.vcf

Y generaríamos así un archivo llamado "abogados.vcf" en formato vCard 3.0.

Aquí os dejo una muestra de cómo funciona:


Y aquí os dejo el programa para que os lo descarguéis:


#!/bin/bash
#
# Script realizado por Astaroth (O.R.G.)
# Visita Astaroth's World: http://astarothsworld.blogspot.com
#
# Este programa pasará todos los contactos contenidos en un archivo ASCII (.asc) con separación ";" con la siguiente estructura:
#
# "Apellido";"Dirección";"Código postal";"Ciudad";"Provincia";"Teléfono";"Fax";"Móvil";"E-mail";"URL";"Actividad"
#
# A una targeta vCard 3.0.
#
# El primer argumento será el archivo .asc, el seguiente el vCard de salida, p.e.: ./asc2vcard.sh Archivo.asc Agenda.vcf
#
# La función de (ú)nica (l)ínea hace que elementos que ocupen varias líneas se lean como una sola cadena de texto que ocupe una línea.
function ul {
echo "$1 $2 $3 $4 $5 $6 $7"
}
# Determinar número de líneas
fin=`grep -c "" $1`
# Escribir datos
(
for linea in $(seq 2 $fin); do
porc=`echo "scale=2; 100 / $fin * $linea" | bc`
echo "$porc"
echo "# Convirtiendo línea $linea de $fin"
v=`echo "$linea""p"`
lineatext=`cat $1 | sed -n "$v"`
Nombre=`echo $lineatext | awk -F\; '{print $1}' | sed 's/"//g' | grep -o "[[:print:]].*"`
Nombre=`ul $Nombre`
Direccion=`echo $lineatext | awk -F\; '{print $2}' | sed 's/"//g' | grep -o "[[:print:]].*"`
Direccion=`ul $Direccion`
CP=`echo $lineatext | awk -F\; '{print $3}' | sed 's/"//g' | grep -o "[[:print:]].*"`
CP=`ul $CP`
Ciudad=`echo $lineatext | awk -F\; '{print $4}' | sed 's/"//g' | grep -o "[[:print:]].*"`
Ciudad=`ul $Ciudad`
Provincia=`echo $lineatext | awk -F\; '{print $5}' | sed 's/"//g' | grep -o "[[:print:]].*"`
Provincia=`ul $Provincia`
Tel=`echo $lineatext | awk -F\; '{print $6}' | sed 's/"//g' | sed 's/+34//g' | grep -o "[0-9].*" | sed 's/\.//g'`
Tel=`ul $Tel`
Fax=`echo $lineatext | awk -F\; '{print $7}' | sed 's/"//g' | sed 's/+34//g' | grep -o "[0-9].*" | sed 's/\.//g'`
Fax=`ul $Fax`
Movil=`echo $lineatext | awk -F\; '{print $8}' | sed 's/"//g' | grep -o "[[:print:]].*"`
Movil=`ul $Movil`
Mail=`echo $lineatext | awk -F\; '{print $9}' | sed 's/"//g' | grep -o "[[:print:]].*"`
Mail=`ul $Mail`
URL=`echo $lineatext | awk -F\; '{print $10}' | sed 's/"//g' | grep -o "[[:print:]].*"`
URL=`ul $URL`
echo "BEGIN:VCARD" >> temp
echo "ADR;TYPE=home:;;$Direccion;$Ciudad;$Provincia;$CP;Spain" >> temp
echo "CLASS:PUBLIC" >> temp
echo "EMAIL:$Mail" >> temp
echo "FN:$Nombre" >> temp
echo "N:$Nombre;;;;" >> temp
echo "TEL;TYPE=HOME:$Tel" >> temp
echo "TEL;TYPE=FAX:$Fax" >> temp
echo "TEL;TYPE=CELL:$Movil" >> temp
#echo "UID:crbIJvUel5" >> temp
echo "URL:$URL" >> temp
echo "VERSION:3.0" >> temp
echo 'END:VCARD' >> temp
echo "" >> temp
done
) | zenity --progress --title="asc2vcard : Creando Agenda" --auto-kill --auto-close
#
# Corrección de espacios extras:
(cat temp | sed 's/ *;/;/g' > $2
rm temp) | zenity --progress --title="asc2vcard : Corrigiendo Errores" --text="Se están borrando espacios sobrantes..." --pulsate --auto-kill --auto-close


Quizá os interese:

1 comentario:

  1. porq vives tan lejos de mi casa?
    yo tengo muchos problemas informáticos....esto d utilizar el linux lo describes un poco chungamente no?
    k le pasa con los cds?
    cuéntame la información k poseas sobre él antes de k m cargue d nuevo el pc cambiándole el sistema operativo..otra vez...

    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+.