martes, 22 de enero de 2013

Separador de nombre y apellidos.






Muchas veces nos llega un listado, en Excel o en texto, con una relación de nombres y apellidos con un formato “nombre 1 apellido 2º apellido”. Muchas veces ese formato no nos vale, necesitamos separar en columnas el nombre y los apellidos. Esta utilidad separa el nombre y los apellidos, colocándolos en una columna cada uno.
 Al haber nombres compuestos, apellidos compuestos, una combinación de ambos, e incluso  personas con un solo apellido y al ser muy difícil separarlos automáticamente, los nombres o apellidos compuestos se deben resolver por parte del administrador, pero sin tener que reescribir esos nombres. Sencillamente se indica el número de separador (espacio) que separa el nombre del primer apellido y el segundo apellido del primero.

Utilizo las siguientes funciones:
Sustituir()
Espacios()
Encontrar()
Indice()
Si()
EsErr()
Izquierda()
Extrae()

Algoritmo, o como se hace:

  • Preparar el dato.
  • Localizar los espacios.
  • Indicar posición separadores. Manual, por parte del administrador.
  • Separar datos.
  • Copiar, pegado especial, valor.

Preparación del dato:
El listado con los nombres recibido hay que copiarlo el la columna A. En la columna B, que normalmente debería permanecer oculta, preparo cada nombre para su proceso. Esta preparación, en este caso, consiste en suprimir los espacios que puedan rodear, antes o después del nombre, el dato, en convertir los posibles dobles espacios entre palabras en un solo espacio y en añadir al final de la línea un espacio. El algoritmo utilizado para separar palabras necesita que un espacio, y solo uno, al final del nombre. Este pequeño truco garantiza que siempre habrá al menos dos separadores, lo que evita un error en los nombres con un solo apellido. Para líneas en blanco o sin espacios si se producirá un error.
  1. Los espacios los elimino utilizando la función ESPACIOS().
  2. Para sustituir los posibles dobles espacios utilizo, dos veces, anidada, la función SUSTITUIR() y por último concateno un espacio.
=SUSTITUIR(SUSTITUIR(ESPACIOS(A2);"  ";" ");"  ";" ") & " "

Localización de espacios:
Entre las columnas C y L se localizan los posibles espacios entre palabras mediante función ENCONTRAR(), controlando los posibles errores mediante la función EsErr() y la función SI().
La función encontrar tiene tres parámetros, el valor buscado, el texto dentro del cual se busca y un tercer parámetro opcional que indica, en número, a partir de que carácter se busca. Por eso, en esta utilidad, se hace referencia (+1) al valor anterior encontrado. 


En la columna D encontramos la siguiente fórmula :

=SI(ESERR(ENCONTRAR(" ";$B2;C2+1));-1;ENCONTRAR(" ";$B2;C2+1))

En donde C2 es la posición del anterior espacio dentro del nombre (B2). Si C2 fuese el último espacio espacio la función ENCONTRAR() daría un error. Si se produce ese error la función SI() nos devuelve un -1 y si no nos devuelve la posición del espacio, y así sucesivamente. He preparado la hoja para encontrar hasta 10 espacios, que considero que es suficiente para separar cualquier nombre. No obstante también calculo la longitud del nombre con






Separación del dato:
En las columnas N y O el administrador indica la posición, en numero, de los separadores (blancos) entre nombre y apellidos y apellidos entre si.  No es el numero de carácter que hace el espacio dentro del texto, es ordinal de los espacios (primero, segundo,..) A la hora de preparar las líneas,  como norma general, deben valer 1 y 2. Para nombres compuestos, por ejemplo “Juan Ramón” el espacio que separa nombre de apellidos es el segundo espacio. Para “María del Carmen” el espacio separador es el tercero, etc. Lo mismo sucede con el espacio que separa los apellidos entre si.

El nombre, en la columna Q, se separa mediante la fórmula =IZQUIERDA($B2;INDICE($C2:$L2;$N2)-1), en donde $N2 es la posición del separador. El primer apellidos lo encuentra entre el primer separador (N) y el segundo (O). El segundo apellido lo encuentra entre el segundo separador y el último carácter de la cadena.
La posición de los espacios dentro del texto está en el rango $C2:$L2. Con la función
INDICE($C2:$L2;$N2) obtenemos esa posición y a partir de ella, dividimos.

Por último el resultado se debe copiar y pegar, con el pegado especial, como valor, en el sitio de destino.










No hay comentarios:

Publicar un comentario