lunes, 10 de septiembre de 2018

¿Cómo genero una llave GUID en Excel?


Cuando diseño bases de datos, generalmente uso llaves subrogadas para identificar de manera única los registros e índices únicos para definir como única la entidad (lógica del registro), sin embargo, hasta hace algún tiempo venia empleando llaves subrogadas numéricas como identificador de los registros y dejaba la carga a la base de datos de generarlos como por ejemplo: Secuencias para Oracle, Identity para SQL Server o Seriales para PostgreSQL, sin embargo, hace poco comencé a usar los GUID y estoy encantado con uso.

Algunas ventajas de uso:

  • ·         No requiero Scripts complejos para trasladar información entre tablas.
  • ·         Son casi que irrepetibles es 10^38.
  • ·         Los puedo generar desde el aplicativo, adiós a las secuencias.
  • ·         Facilita la migración del modelo entre Bases de Datos.

Los inconvenientes que le veo son:
  • ·         Dificulta la búsqueda de un registro por consultas creadas a mano (depuración)
  • ·         Genera un mayor consumo en Bases de Datos  (No tan relevante hoy en día)
  • ·         Puede disminuir el rendimiento de las consultas.


Ahora si te interesa llaves GUID y necesitas cargar datos, por ejemplo: cargar un listado de datos desde un Excel. 

Aquí te dejo la formula para crear GUID desde Excel.
=MINUSC(CONCATENAR(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;4);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;4);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;4);"-";EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;6);EXTRAE(DEC.A.HEX(ALEATORIO.ENTRE(0;4294967295);8);1;6)))

Para finalizar les recuerdo:

·         Cada quien tiene su forma de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo.
·         Estos artículos son ejemplos; así que, si tienes una mejor manera de hacerlo, o puedes colaborarme con alguna observación, tu comentario es bienvenido.
·         No asumo ninguna responsabilidad por el uso de lo expuesto.
·         Si los artículos te son de utilidad, no olvides un “Me Gusta”, o dejar algún comentario.


lunes, 23 de enero de 2017

Comparación de datos patronímicos usando búsquedas difusas “Comparación de nombres”

Hace algún tiempo me pidieron hacer un cruce de información para hallar equivalencias entre dos tablas de personas en una base de datos, una con 10 y otra con 9.3 millones de registros, lo que corresponde a unos 93 billones de combinaciones aunque, en ese entonces, logré optimizar el proceso reduciendo el tiempo de una semana a 11 horas, empleando tablas temporales y logrando mejores resultados en algunas funciones e índices;  me quedaron dudas sobre el algoritmo de comparación ya que la calidad de los datos no era la mejor, así que cuando me volvieron a solicitar un trabajo similar, decidí crear mi propio algoritmo de comparación utilizando búsquedas difusas sobre datos patronímicos .

Las búsquedas difusas consisten en consultas que se hacen sobre información sin tener en cuenta la ortografía de las palabras, trabajan en el parecido de las palabras; mientras que una búsqueda normal encuentra las palabras con su escritura exacta.

Las búsquedas difusas son muy útiles cuando hay elementos con errores de escritura o no se dispone de la información exacta. Estas indagaciones encuentran datos parecidos entre sí y para poder inferir si la información encontrada es la misma con la que se compara, hay que darle un peso (valor) a los datos a cotejar y establecer un porcentaje de exactitud para tal fin.

Las búsquedas difusas son muy útiles, por ejemplo, cuando se compara información de personas (datos patronímicos) que vienen de múltiples fuentes y que tienen diferencias en la escritura de sus nombres. Para el ejemplo compararemos: el Tipo de identificación, Número de identificación, Primer Nombre, Segundo Nombre, Primer Apellido, Segundo Apellido, Fecha de Nacimiento y el Género.

Aunque, en mí concepto, no existe lo que se denomina primer y segundo nombre, sino un nombre compuesto como “Juan José”, que para el presente caso separo en dos, porque en la mayoría de comparaciones que me han solicitado el nombre de la persona viene clasificado en dos columnas.

A continuación, comento los principales problemas encontrados durante la comparación de los datos de personas que he realizado:

  • Errores que se presentan debido a las variadas formas en que escriben el nombre de una persona, por ejemplo: Janeth, Yaneth
  • Errores en la digitación del documento de identidad: 95454137, 95454134.
  • Nombres escritos sin la tilde que representa el acento que llevan algunos nombres como Jose por José.
  • Los nombres no los diligencian completos, por ejemplo: Juan José lo diligencian solamente Juan o Juan J.
  • Apellidos incompletos, solo escriben el apellido paterno y no diligencian el materno.
Para solucionar estos inconvenientes, decidí hacer mi propio algoritmo de comparación, para lo cual investigué cómo cotejar la información de personas y como resultado de esto ubiqué los algoritmos Soundex, Metaphone y Levenshtein. Después de analizarlos descubrí que el Soundex no tiene en cuenta la longitud de la palabra a comparar y éste, al igual que el metaphone, no está ajustado para el español; ante lo cual elaboré una versión propia que intenta corregir errores de escritura en este idioma.

Para la comparación del documento de identificación uso el algoritmo de Levenshtein.

Como resultado creé un código de comparación que puede descargarse al final del artículo. Este algoritmo permite la comparación y búsqueda de personas, originando consecuentemente un porcentaje de aproximación que indica la proporción de probabilidad en que la información de una persona pueda ser igual a la de otra.

Este algoritmo es configurable de manera que puedes modificar con los porcentajes de peso de cada atributo, que quieres comparar y un atributo para decidir cuales considerar como el mismo dato. En la tabla a continuación encontraras las variables, pesos y porcentaje de comparación usadas durante el ejemplo:

Datos de una persona
Variable
% Peso
Tipo de identificación
CodigoTipoIdentificacion
4.00%
Identificación
Identificacion
30.00%
Primer Nombre
PrimerNombre
14.00%
Segundo Nombre
SegundoNombre
14.00%
Apellido Paterno
ApellidoP
15.00%
Apellido Materno
ApellidoM
15.00%
Fecha de nacimiento
Nacimiento
4.00%
Género
Genero
4.00%
Porcentaje exactitud
Exactitud
90,0%

Los datos que vamos comparar son los siguientes:

Persona Uno
Persona Dos
CC
CC
85454136
85454137
Janeth
Yaneth
Helena
Elena
Velasquez
Velazquez
Romero
Romero
20/11/1968
20/11/1968
M
M

Los pasos básicos para la comparación de nombres son:

  1. Eliminar acentos y caracteres especiales del nombre de la persona.
  2. Ajustar posibles errores de escritura en el nombre.
  3. Convertir los nombres a un código basado en su pronunciación.
  4. Confrontar los nombres por su código y aplicar un valor al resultado de la misma.
  5. El número de identificación se compara mediante el algoritmo de Levenshtein.
  6. Devolver el porcentaje de aproximación de la comparación.


En la siguiente tabla, se podrá observar la comparación de dos personas sin utilizar ningún algoritmo de transformación en la data; es decir,  se comparan los datos directamente, utilizando un peso a los atributos se obtiene una probabilidad de 27% que sea la misma persona.

Datos de una persona
Persona Uno
Persona Dos
Peso Variables
Resultado
Tipo de identificación
CC
CC
4,0%
4,0%
Identificación
85454136
85454137
30,0%
0,0%
Primer Nombre
Helena
Elena
14,0%
0,0%
Segundo Nombre
Yaneth
Janeth
14,0%
0,0%
Apellido Paterno
Velasques
Velazquez
15,0%
0,0%
Apellido Materno
Romero
Romero
15,0%
15,0%
Fecha de nacimiento
20/11/1998
20/11/1998
4,0%
4,0%
Género
F
F
4,0%
4,0%
Total


100,0%
27,0%
Porcentaje de aproximación comparación directa



27,0%

Ahora, aplicando algoritmos para búsquedas difusas y comparando los códigos de los nombres y mediante Levenshtein el número de identificación se obtiene una aproximación del 96.25% como se aprecia en el siguiente cuadro:

Datos de una persona
Persona Uno
Persona Dos
Código Uno
Código Dos
Peso Variables
Resultado Comparación
Tipo de identificación
CC
CC
CC
CC
4,0%
4,00%
Identificación
85454136
85454137
85454136
85454137
30,0%
26,25%
Primer Nombre
Helena
Elena
E5E6A
E5E6A
14,0%
14,00%
Segundo Nombre
Yaneth
Janeth
YA6E3
YA6E3
14,0%
14,00%
Apellido Paterno
Velasques
Velazquez
BE5A47UE
BE5A47UE
15,0%
15,00%
Apellido Materno
Romero
Romero
RO6E9O
RO6E9O
15,0%
15,00%
Fecha de nacimiento
20/11/1998
20/11/1998
20/11/1998
20/11/1998
4,0%
4,00%
Género
F
F
F
F
4,0%
4,00%
Total




100,0%
96,25%
Porcentaje de exactitud comparación con algoritmos para búsquedas difusas
96,25%

Como se puede apreciar, la comparación al utilizar la codificación se obtiene un mejor resultado. Al finalizar este artículo se encontrará un archivo de VBA para macros en Excel y un programa escrito en C#, con el que se podrá investigar más de este tema. Es posible que se encuentren diferencias entre los algoritmos de Excel y C#, esto se debe a la diferencia de tiempos en que los escribí.

Otros análisis:

Aunque ésta es una comparación muy sencilla, existe mucho trabajo por delante con este tema, por ejemplo, para trabajar grandes volúmenes de datos pueden agregárseles columnas con los códigos de las palabras a la base de datos de personas y actualizar el código al guardar o modificar, con lo que las búsquedas serían mucho más eficientes.

Se puede trabajar en un algoritmo de separación del nombre de una persona cuando la información viene unida en un solo campo, Esto se puede trabajar con una tabla de nombres y apellidos con un porcentaje de que diga cuando una palabra aparece más veces como nombre o apellido, esto brindaría la oportunidad de separar los datos usando estadísticas.

El código se podrá descargar de los siguientes enlaces:

  • Descargar aquí macro de Excel
  • Descargar aquí Programa en C#


Para finalizar les recuerdo:

  • Cada quien tiene la manera de matar sus propias pulgas, así que puede haber una gran cantidad de formas de hacer el mismo trabajo.
  • Estos artículos son ejemplos, así que, si se tiene un mejor procedimiento para  hacerlo,  o pueden colaborarme con alguna observación, el comentario es bienvenido.
  • No asumo ninguna responsabilidad por el uso de lo expuesto.
  • Si los artículos son de utilidad, no olvide dar un “Me Gusta”, compartirlo a través de las redes sociales, o dejar algún comentario.  tenga en cuenta que para nosotros es un motivo de alegría compartir conocimiento.
  • Para mantener el blog se usa publicidad de google AdSense. Por lo tanto, agradecemos tratar de no usar bloqueadores de publicidad en esta página.
  • Excel y Visual Studio, son programas y marcas registradas de la empresa Microsoft.
  • El Blog utiliza cookies para registrar hábitos de navegación.

lunes, 31 de octubre de 2016

Enviar correos masivos desde Word con Combinar Correspondencia

El envió de correos a varios destinatarios de manera masiva e independiente a cada destinatario desde una cuenta de correo propia, es algo sencillo que se puede hacer desde nuestro propio computador.
Para hacer esto basta tener instalado Excel, Word y Outllok.

Pasos para enviar correos desde tu PC:


  • Debes tener una cuenta de correo electrónico pre configurada en Outlook.
  • Crea un archivo Excel con dos columnas, Una con el nombre de la persona y otra con el Correo.
  • Diligencia los correos en el archivo de Excel.
  • Abrir Word y crear un documento nuevo
  • En la pestaña de “Correspondencia” pulsar clic en la opción “Iniciar combinación de correspondencia” 
  • Escoger la opción “Paso a paso por el asistente de combinar correspondencia”, Esta opción abrirá a la derecha del Word el asistente.
  • En el asistente (Parte derecha de la pantalla escoger la opción “Mensajes de correo electrónico” 
  • Clic en la parte inferior en el Paso 1 de 6 “Siguiente: Inicie el documento”
  • En el segundo paso, puedes usar la primera opción del asistente “Utilizar el documento actual”
  • Pulsa clic en la opción del paso 2 de 6 “Siguiente: Seleccionar los destinatarios”
  • Estando en el paso 3 de 6, pulsa clic en la opción “Examinar” y selecciona la hoja de Excel con los correos de los destinatarios.
  • Pulsar clic en la opción 3 de 6 “Siguiente: Escriba el mensaje” y escribes el correo que quieres enviar.
  • En este momento puedes personalizar el correo a cada persona utilizando la opción “Insertar campo combinado” para que cada correo vaya con el nombre de la persona a quien va dirigido.
  • Una vez terminado de diligenciar el correo, puedes visualizar como va a quedar pulsando clic en la opción de la cinta “vista previa de resultados”.
  • Para enviar el correo debes pulsar clic en la opción “Finalizar y combinar”, luego escoges Enviar mensajes de correo electrónico.


Antes de enviar correos debes tener en cuenta lo siguiente:


  • No utilice información de encabezado falsa o engañosa. 
  • No utilice asuntos engañosos. La línea de asunto debe reflejar el contenido y objetivo del mensaje.
  • Informe a los destinatarios su ubicación. preferiblemente su dirección física o un apartado.
  • Identificar el mensaje como un anuncio. 
  • Dentro del mensaje coloque una opción o instructivo que indique al destinatario como dejar de recibir sus correos en el futuro. Es muy desagradable estar recibiendo correos no deseados.
  • Una vez el destinatario te solicito darlo de alta en tu lista de distribución no vuelvas a enviarle correos.
  • No envíes el texto del mensaje en mayúsculas, equivale a gritar.
  • Anqué Outlook tiene formas de hacer seguimiento los correos enviados, esta opción no es fiable al 100%, así que, si quieres correos con confirmación de lectura, tendrás que usar servicios adicionales.
  • No olvides leerte la ley de protección de datos de tu país, en Colombia la podrás encontrar en el siguiente link: protección de datos personales


Para finalizar les recuerdo:

Cada quien tiene su manera de matar pulgas, así que puede haber una gran cantidad de maneras de hacer el mismo trabajo.


  • Estos artículos son ejemplos, así que, si tienes una mejor manera de hacerlo o puedes colaborarme con alguna observación, tu comentario es bienvenido.
  • No asumo ninguna responsabilidad por el uso de lo expuesto.
  • Si los artículos son de utilidad, no olvides un “Me Gusta”, Compartirlo o dejar algún comentario.
  • Para mantener el blog se usa publicidad de google AdSense
  • Word, Excel y Outlook son programas y marcas registradas de la empresa Microsoft
  • El Blog utiliza cookies para registrar hábitos de navegación.


Entrada destacada

Arquitectura de N-Capas con Visual Studio .NET y AngularJS

Este artículo es el primero de una serie de artículos en que quiero explicar mi visión de la programación por capas. La Arquitectura ...