O.T.: Seprar nombres y apellidos en MySQL

713 views
Skip to first unread message

Alejandro García Garay

unread,
May 14, 2022, 12:12:12 PM5/14/22
to Comunidad de Visual Foxpro en Español
Cordial saludo.

Debo hacer una modificación a una tabla MySQL que contenia solament una columna con el nombre completo de unos terceros, me solicitan hacer algo para separar estos nombres y apellidos para tenerlos individuales pero en MySQL, no en VFP. Quieren tener como una función para hacer esto.

¿Alguno tiene idea o sabes como haerlo? he buscado por la web pero los códigos que encuentro no están completos, tienen detalles.

Gracias.

HernanCano

unread,
May 14, 2022, 12:43:32 PM5/14/22
to Comunidad de Visual Foxpro en Español
Muestra el que mejor te parece y te decimos como mejorarlo.

Victor Espina

unread,
May 14, 2022, 12:53:16 PM5/14/22
to Comunidad de Visual Foxpro en Español
El problema con eso es cómo decides que parte es nombre y qué parte es apellido ?  Por ejemplo, asumiendo que los nombres están grabados en el formato NOMBRE APELLIDO, podrías empezar con esta lógica:

1. Aplicar un LTRIM(RTRIM()) para eliminar los espacios al inicio y al final (solo por seguridad)
2. Reemplazar toda aparición de SPACE(2) por SPACE(1) hasta que no queden espacios en blanco contiguos
3. Contar la cantidad de espacios en blanco que quedan. Cada aparición se considera un superado
4. Si tienes 3 o mas espacios en blanco eso corresponde a alguien con dos nombres y dos apellidos (PEDRO JOSE GONZALEZ RAMIREZ).  En este caso, ubica la posición del 2do espacio en blanco y haz un LEFT para obtener los dos nombres y luego un SUBSTRING para obtener los apellidos.
5. Si tienes 2 espacios en blanco, asumes que corresponde a alguien con dos nombres y un solo apellido (PEDRO JOSE GONZALEZ).  En este caso aplicas la misma operación que en el punto anterior.
6. Si tienes 1 espacio en blanco, asumes que corresponde a alguien con un solo nombre y un solo apellido (PEDRO GONZALEZ).  En este caso, aplicas la misma técnica que en los dos puntos anteriores, pero buscando la posición del primer espacio en blanco, en lugar del 2do.

Una vez hecho esto, seria cuestión de ver que registros te quedaron que no cayeron en ninguno de esos casos y manejarlos de forma independiente.


Saludos

Victor Espina

HernanCano

unread,
May 14, 2022, 1:10:20 PM5/14/22
to Comunidad de Visual Foxpro en Español
** SepararNom.prg

SQLExec ( nH, "select * from TERCEROS", "TERCEROS" )

if !used('TERCEROS') or reccount('TERCEROS')<1
   MessageBox('No hay datos')
   return .f.
endif

go top in TERCEROS

do while !eof('TERCEROS')
   
   M.cNom = alltrim(TERCEROS.NOMBRE)
   do while space(32)+space(32) $ M.cNom
   M.cNom = strtran(alltrim(M.cNom), space(32)+space(32), space(32) )
   enddo
   
   if GetWordCount(M.cNom)>0
   replace NOM_1 with GetWordNum(M.cNom,1) in TERCEROS
   endif
   if GetWordCount(M.cNom)>1
   replace NOM_2 with GetWordNum(M.cNom,2) in TERCEROS
   endif
   if GetWordCount(M.cNom)>2
   replace APE_1 with GetWordNum(M.cNom,3) in TERCEROS
   endif
   if GetWordCount(M.cNom)>3
   replace APE_2 with GetWordNum(M.cNom,4) in TERCEROS
   endif
   
   text to M.cSQL noshow textmerge pretext 15
   
     update TERCEROS set NOM_1 = '<<alltrim(TERCEROS.NOM_1)>>'
                       , NOM_2 = '<<alltrim(TERCEROS.NOM_2)>>'
                       , APE_1 = '<<alltrim(TERCEROS.APE_1)>>'
                       , APE_2 = '<<alltrim(TERCEROS.APE_2)>>'
        where IDTERCERO = <<alltrim(TERCEROS.IDTERCERO)>>
   
   endtext

   SQLExec ( nH, M.cSQL )

   skip in TERCEROS
enddo

**

Jean Pierre Adonis De La Cruz Garcia

unread,
May 14, 2022, 4:07:31 PM5/14/22
to Comunidad de Visual Foxpro en Español
Realmente este es un tema un poco complejo, no es tan facil como parece, por que lo digo por que realmente he manejado millones de datos de personas, y sucedia lo sgte.
Personas con 2 nombres y apellidos paterno y matenos, lo mas comun, pero despues empezaban los problemas, personas con 1 solo nombee, presonas con un solo apellido, personas con apelidos compuestos, personas que usan  apellidos como nombers y otros q usan nombres como apellidos, personas que llevan estdo civil de cadados y son compuestos y complejos al escribirlos y muchas pero muchas otras cosas raras por esta parte.
Aca unos ejemplos yo los he separado por coma, primero el nombre y despues el apellido
JORGE SANTOS, JORGE
JOSE MARIA, LUCIA PEREZ
LEANDRO, SANCHEZ
ANIBAL CESAR CARLOS, DONAYRE
CESAR, CARLOS ALMEYDA
ETC, ETC.


La unica solucion real que tuve era obtener la fuent principal de donde provenia esos datos, ya a partir de ahi pude realizar mi separacion adecuada, ya que por mas que intente de hacer por mucho tiempo no me sirio de nada.
OJO, eso lo digo cuando es una base de datos enorme, pero si tienes una data de 100 o por decir hasta 1000 registros nada mas y que no incrementara, realizalos manualmente.
Espero no incomodar con esto o no desanimarte realmente.

Antonio Meza

unread,
May 14, 2022, 8:31:27 PM5/14/22
to Comunidad de Visual Foxpro en Español
Realmente es un tema super complejo jejejejej

Le agrego dos datos mas a la lista de los que ya han indicado

1. Que escribieron Nombre(s) y Apellidos, pero resulta que otro usuario u otros usuarios escribieron Apellidos y Nombre(s)
2. En México es común apellidos como "De La Fuente", "Del Valle", imagina alguien con el nombre "María de Jesús de la Fuente del Valle", o que se llame Felipe Calderón del sagrado corazón de Jesús Hinojosa!!!! jajajajajaja

Es mas fácil ir registro por registro para corregir el problema.

Que la fuerza lo acompañe!!! jejejeje
saludos
Antonio Meza

Ricardo Soldini

unread,
May 14, 2022, 10:57:32 PM5/14/22
to Comunidad de Visual Foxpro en Español
Yo uso estas funciones que se invocan de la siguiente forma
defino 3 variables para Nombre Paterno Materno
       paterno=Space(15)
        materno=Space(15)
        nombres=Space(25)
        sep_pat_mat_nomb(MI_LI.Nombre)  Invoco la funcion con todo el Nombre y los apellidos
EN TU CASO PODRIAS PASAR LA DATA DE LA BD UN CURSOR 
Y LUEGO PARA EL NOMBRE PASARLE LA FUNCION 

LA TABLA QUE TIENE EL NOMBRE   VIENE CON EL SIGUIENTE ORDEN PREESTABLECIDO APELLIDO PATERNO, APELLIDO MATERNO NOMBRE(S)
LAS VARIANTES SON QUE PUEDE HABER APELLIDO PATERNO PUNTO NOMBRE (CASOS PUNTUALES) EN TAL CASO HABRIA QUE CONTROLAR EL CARACTER .



Function sep_pat_mat_nomb(nombre)
Local ln, j, r, extr
Set Exact On
extr=''
m.nombres=''
m.nombr1=''
ln=Len(nombre)
j = 1  && CON ESTO CUENTO LOS ESPACIOS ENTRE NOMBRES Y APELLIDOS
For r = 1 To ln
    Do Case
    Case j = 1
        If Substr(nombre,r,1) != " "
            extr=extr+Substr(nombre,r,1)
        Else
            If !del_o_de(extr)
                paterno=extr+" "
                extr=''
                j=2
            Else
                extr=extr+" "
            Endif
        Endif
    Case j = 2
        If Substr(nombre,r,1) != " "
            extr=extr+Substr(nombre,r,1)
        Else
            If !del_o_de(extr)
                materno=extr+" "
                extr=''
                j=3
            Else
                extr=extr+" "
            Endif
        Endif
    Case j = 3

        If Substr(nombre,r,1) != " "
            extr=extr+Substr(nombre,r,1)
        Else
            If !del_o_de(extr)
                m.nombres=extr+" "
                extr=''
                j=4
            Else
                extr=extr+" "
            Endif
        Endif
    Case j = 4
        m.nombr1=m.nombr1+Substr(nombre,r,1)
    Endcase
Next
If m.nombres != ''
    m.nombres=Ltrim(m.nombres)
Else
    If m.nombr1 != ''
        m.nombres=m.nombr1
    Endif
Endif
Return

&& en esta funcion hay que agregar todas las excepciones a la regla del conjunto de datos  como lo que se muestra ahi en que cubro los nombre so apellidos como 
&& DE MARCO 
&& DE LA FUENTE
&& DEL SOL
&& SAN ESTEBAN
&& ETC
Function del_o_de(palab)
ret=.F.
Do Case
Case Upper(Alltrim(palab)) == "DE"
    ret=.T.
Case Upper(Alltrim(palab)) == "LA"
    ret=.T.
Case Upper(Alltrim(palab)) == "DEL"
    ret=.T.
Case Upper(Alltrim(palab)) == "SAN"
    ret=.T.
Case Upper(Alltrim(palab)) == "MC"
    ret=.T.
Case Upper(Alltrim(palab)) == "MAC"
    ret=.T.
Case Upper(Alltrim(palab)) == "LOS"
    ret=.T.
Case Upper(Alltrim(palab)) == "LAS"
    ret=.T.
Case Upper(Alltrim(palab)) == "DI"
    ret=.T.
Case Upper(Alltrim(palab)) == "O'"
    ret=.T.
Case Upper(Alltrim(palab)) == "AL"
    ret=.T.
Case Upper(Alltrim(palab)) == "LO"
    ret=.T.
Case Upper(palab) == "DE LA"
    ret=.T.
Endcase
Return(ret)


HernanCano

unread,
May 14, 2022, 11:18:02 PM5/14/22
to Comunidad de Visual Foxpro en Español
Claro que sí, Ricardo-Antonio-Consultor.

De todas formas es un inicio (los comandos que propongo).

Zarlu

unread,
May 16, 2022, 9:08:28 AM5/16/22
to Comunidad de Visual Foxpro en Español
Buenos días agarciagaray.igd !

La idea es que puedas avanzar lo más que puedas con código.
Creo que inevitablemente algunos tendrás que trabajarlos manualmente.

Quizá tengas algún campo que te permita comprobar el orden de los apellidos.
Es decir.... por ejemplo en México el RFC (SAEL680216...) te muestra la primera letra y la primera vocal del primer apellido y la primera letra del segundo apellido..... y esto sirve de guía para extraer los datos.

Suerte
zarlu
Chetumal, Quintana Roo, México

Víctor Hugo Espínola Domínguez

unread,
May 18, 2022, 9:42:23 AM5/18/22
to publice...@googlegroups.com
Hay tareas que no se pueden automatizar, esta es una de ellas. Mi sugerencia es que le hagas un form donde muestres el dato en una columna de solo lectura  y en la contigua el mismo dato con la posibilidad de aceptar una coma o algún carácter especial (solo uno), el último digitado sustituye al anterior. Ese carácter indicará la separación entre entre nombres y apellidos.

Si son muchos registros se soluciona con más operadores.

Nota: No es igual tener datos "feos" que datos equivocados.

Saludos,
Víctor.
Lambaré - Paraguay.



--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/44de463c-b883-40df-a2c6-3c1bce473af9n%40googlegroups.com.

ZeRoberto

unread,
May 18, 2022, 9:42:23 AM5/18/22
to publicesvfoxpro
Como estan definidos en tu columna nombres, me refiero a que si el nombre y el apellido estan separados por una coma o solo espacio

Saludos

Ze





--

Alejandro García Garay

unread,
May 18, 2022, 11:33:33 AM5/18/22
to Comunidad de Visual Foxpro en Español
Saludos. Gracias a todos por las respuetas.

No había podido responder antes por diversos motivos. Les comento, me resulto mas fácil realizar un proceso en Visual FoxPro para hcer la separación, la idea era ver si se podia hacer directamente en la base de datos mediante una función o un procedimiento pero me resulto muy complicado (algunos nombres tienen "de", apellidos compuestos y así).

La columna que contiene el nombres una sencilla varchar de 250 caracteres, un ejeplo de nombre es PEREZ DE GONZALEZ JUAN DE JESÚS, por ejemplo, la idea es llenar las siguientes columnas: 
APELLIDO_1 PEREZ
APELLIDO_2 DE GONZALEZ
NOMBRE_1 JUAN
NOMBRE_2 DE JESÚS

Bueno, como les comente hice un prg en VFP para ayudarme co esa parte. 

Reply all
Reply to author
Forward
0 new messages