Dividir una columna con nombres y/o apellidos compuestos consiste en dejar en columnas separadas los nombres y apellidos, teniendo en cuenta que, si existe algún nombre y/o apellido compuesto (ejemplo: “de las Morenas”), entonces, la o las preposiciones, artículos, contracciones y el nombre en sí, deben quedar en su propia columna. Por ejemplo, el nombre: “Alejandra de las Mercedes Palomino Rocha”, debe quedar: “Alejandra”, “de las Mercedes”, “Palomino“, “Rocha”. donde cada separación es para una columna.
Dividir Nombres y Apellidos Compuestos
.
Función: Splitter.SplitByCompoundName
Puedes estudiar el detalle de la construcción de la función personalizada (aquí) / Gratis
Introducción
.
En una única columna podemos encontrar nombres y apellidos con una parte compuesta y una sola preposición, ejemplo: “Juan de Dios Vargas Castro”, también podemos hallar una parte compuesta con dos preposiciones, ejemplo: “Sara Milena de la Oz Camacho”, adicionalmente se puede encontrar un nombre con varias partes compuestas con una o dos preposiciones, ejemplo: “Tatiana de los Milagros Rocamora de las Morenas” o casos más extremos como: “Julieth de los Reyes de la Castellana y de la Peña”, y por su puesto es posible un nombre sin ninguna parte compuesta, ejemplo: “Diana Alejandra López Vargas”. Los siguientes casos también son viables: “Miguel Caballero Sierra” y “Fabian Torres”. Véase la columna Nombre en la tabla de la imagen a continuación.
Función Splitter.SplitByCompoundName
.
Para solucionar este caso, en una consulta en blanco en el editor de Power Query de Power BI o Excel, copie y pegue la función personalizada debajo y renómbrela como: Splitter_SplitByCompoundName (aunque el nombre puede ser cualquiera de tu preferencia), si deseas añadir la función a la librería de funciones M para quede 100% nativa, por consiguiente sea posible llamarla con el punto, es decir: Splitter.SplitByCompoundName, mira los detalles de cómo hacerlo en este vídeo.
Para dividir la columna con nombres/apellidos compuestos, debemos implementar la función personalizada: Splitter.SplitByCompoundName, la cual al pertenecer a la categoría de funciones de separación (Splitter).
Esta función asume que el texto (nombre) dado tiene alguna de las siguientes es estructuras “<Primer nombre> <Segundo nombre> <Primer apellido> <Segundo apellido>” o “<Primer nombre> <Primer apellido> <Segundo apellido>” o “<Primer nombre> <Segundo apellido>” e incluso estos mismos casos pero iniciando con los apellidos, es decir, “<Primer apellido> <Segundo apellido> <Primer nombre> <Segundo nombre>”.
Sintaxis
=
Splitter.SplitByCompundName (
Nombre as text,
Optional ApellidoPrimero as nullable logical,
Optional PrimeraPreposicion as nullable list,
Optional SegundaPreposcion as nullable list,
Optional TerceraPreposcion as nullable list
) as list
.Su configuración por defecto es para el idioma español por lo que internamente y utiliza la siguientes preposiciones: {“de”, “del”, “los”, “las”, “la”, “lo”, “san”, “vda.”, “y”, “mac”, “mc”}, para otros idiomas o señalar una lista más completa de preposiciones, podemos recurrir a los argumentos opcionales de la función (segundo argumento en adelante).
Función | Descripción |
---|---|
Nombre | Texto con nombres o apellidos compuestos a dividir. |
ApellidoPrimero | true si van primero los apellidos, false (valor por defecto) si van primero los nombres. |
PrimeraPreposicion | Lista de las posible primeras preposiciones. Ej: {“de”, “del”}. |
SegundaPreposicion | Lista de las posibles segundas preposiciones. Ej: {“los”, “las”, “la”}. |
TerceraPreposicion | Lista de las posibles terceras preposiciones. |
Si prefieres un vídeo que detalle cómo se utiliza: clic aquí
Ejemplo 1:
.
La función personalizada: Splitter.SplitByCompoundName, al pertenecer a la categoría de funciones de separación (Splitter) se aplica idealmente al tercer argumento de la función Table.SplitColumns, igualmente es conveniente dejar el cuarto argumento de la función Table.SplitColumns vacío.
La manera más sencilla de implantarla es pulsando clic derecho encima de la columna con nombres y apellidos compuestos que se deseas separar, y Dividir por columna utilizando cualquier criterio, por ejemplo: Dividir por delimitador …, como se muestra enseguida:
En el cuadro de diálogo Dividir columna por delimitador no es necesario modificar nada, ya que eso no interesa, por lo que pulsamos clic en Aceptar inmediatamente. Lo que realmente es de interés es el paso automático que se genera: Dividir columna por delimitador, si se genera el paso Tipo Cambiado eliminarlo.
Seleccionando el paso Dividir columna por delimitador, veremos en la barra de fórmulas la siguiente expresión M:
Ten en cuenta que en la barra de fórmulas veras toda la expresión de largo, algo así: Table.SplitColumn(Origen, “Nombre”, Splitter.SplitTextByDelimiter(” “, QuoteStyle.Csv), {“Nombre.1”, “Nombre.2”, “Nombre.3”, “Nombre.4”, “Nombre.5”, “Nombre.6”}) mientras que en el script previo la presentamos indentada para mayor comodidad.
Para implementar la función Splitter.SplitByCompundName borra en su totalidad las líneas 5 a 9 presentadas en el script #2 y reemplaza por la función Splitter_SplitByCompoundName o por el nombre que hayas decidido ponerle sin argumentos ni paréntesis, vease el script #3 a continuación.
Y voilà:
Ejemplo 2:
.
Si la columna a dividir inicia con los apellidos y luego los nombres, así:
Y sigue algunas de las siguientes estructuras “<primer apellido> <segundo apellido> <Primer nombre> <Segundo nombre>” o “<primer apellido> <Segundo apellido> <Primer nombre>” o “<Segundo apellido> <Primer nombre>”, entonces, se puede solucionar utilizando el segundo argumento de la función denominado: ApellidoPrimero, e indicarlo como true.
Para ello realizamos el mismo proceso del ejemplo 1 para obtener la mayoría del código M mediante la interfaz, e igualmente eliminamos las líneas 5 a 9 mostradas en el script #2, sin embargo, antes de llamar a la función Splitter.SplitByCompoundName (o el nombre que hayas decidido ponerle a la consulta/función) ponemos each, luego si la función con primer argumento: _, y segundo argumento: true.
Y la magia vuelve a ocurrir:
Ejemplo 3:
.
Si necesitas dividir una columna con nombres compuestos en otra idioma, por ejemplo, portugués o agregar más preposiciones, artículos o contracciones, ya que en la lista interna por defecto: {“de”, “del”, “los”, “las”, “la”, “lo”, “san”, “vda.”, “y”, “mac”, “mc”} no cumple con todos tus requisitos, entonces, nos podemos apoyar de los argumentos opcionales.
Imaginemos que necesitamos dividir la columna Nome que contiene nombres de Brasil:
Al no contener las preposiciones: {“da”, “de”, “dos”, “do”} es menester recurrir al tercer argumento de Splitter.SplitByCompoundName, para ello realizamos el mismo proceso del ejemplo 1 para obtener la mayoría del código M mediante la interfaz, e igualmente eliminamos las líneas 5 a 9 mostradas en el script #2, sin embargo, antes de llamar a la función Splitter.SplitByCompoundName (o el nombre que hayas decidido ponerle a la consulta/función) ponemos each, luego si la función con primer argumento: _, después false para el segundo argumento ya que primero van los nombres, finalmente en el tercer argumento proporcionamos la lista: {“da”, “de”, “dos”, “do”}. Véase el script #5 a continuación.
Y listo:
Ejemplo 4:
.
Los argumentos 3 y 4 de la función Splitter.SplitByCompoundName son requeridos si sabemos que un nombre o apellido puede tener dos o tres preposiciones, tomemos un ejemplo hipotético donde para una tabla con una columna llamada “Nom et prénom” existen nombres del siguiente estilo: “Tabatha Pierre et De Le Fermat”, su solución: