Reemplazar cadena dentro de un nombre

HMG en Español

Moderator: Rathinagiri

jparada
Posts: 433
Joined: Fri Jan 23, 2009 5:18 pm

Re: Reemplazar cadena dentro de un nombre

Post by jparada »

andyglezl wrote: Thu Oct 20, 2022 12:06 am Hola
Esto funciona...

Code: Select all

	LOCAL Elemento, aResult
	aDatoABuscar := { ", SA DE CV.", ;
					 "SA. DE CV.", ;
					 "S.A DE CV", ;
					 "S.A.DE C.V.", ;
					 "S.A DE C.V.", ;
					 ".S.A.DE C.V.", ;
					 "S.A. DE C.V.", ;
					 ",S.A. DE C.V.", ;         
					 ", S.A. DE C.V.", ;
					 "S.A DE C.V", ;
					 "S.A. DE C.V", ;
					 "SA DE CV", ;
					 ",SA.DE CV",  ;
					 "SA DE CV.", ;
					 ", S.A DE C.V", ;
					 "S.A DE C.V.", ;         
					 ", S.A. DE.C.V", ;         
					 "S.A. DE C", ;
					 "S.A DE C", ;
					 "S.A. DE" }
					
	aResult := ARRAY( HMG_LEN( aDatoABuscar ) )
	For i1 = 1 TO HMG_LEN( aDatoABuscar )
		aResult[ i1 ] := hb_StrReplace( aDatoABuscar[ i1 ], ;
			{ ' ' => '', '.' => '', ',' => '', 'S' => '', 'A' => '', 'C' => '', 'V' => '', 'DE' => '' } )
	Next
	
	MsgDebug( aResult )
Hola Andrés,

Pues en mi caso esto no funciona, lo que hace el código es del nombre del cliente reemplazar los caracteres uno a uno que estás definiendo, eso deja un desastre en el nombre del cliente...

Igual me ha faltado un poco de contexto... veo que eres de México, sabes que en la facturación 4.0 el nombre del cliente cambia de, por ejemplo:
JAVIER PARADA SA DE CV -> JAVIER PARADA es decir, quitar lo que llaman Régimen Capital.

Ahora en mi caso el problema es que no estaba homologada la captura de la información, por ello cada usuario capturó la información de forma diferente.

Entonces el proceso que intento realizar es leer cada nombre de cliente, ver si contiene la cadena de caracteres que puede ser muy variada y quitar toda esa cadena, es decir, recorrer los nombres de clientes:

JAVIER PARADA SA DE CV ---> quitar SA DE CV y dejar JAVIER PARADA
NOMBRE DE CLIENTE2,SA DE CV ---> quitar ,SA DE CV y dejar NOMBRE DE CLIENTE2
OTRO CLIENTE, S.A DE CV. ---> quitar , S.A DE CV. y dejar OTRO CLIENTE y así...

y sólo expuse una muestra de los caracteres que intento quitar, tengo muchos otros, por ejemplo:

", S DE RL DE C.V" => "", ;
"S DE R L DE CV" => "", ;
"S. DE P.R. DE R.L" => "", ;
"SPR DE RL DE CV" => "", ;
"SAPI DE C.V." => "", ;
"S A B DE C.V." => "", ;
"S.C." => "", ;
"S.C" => "", ;
"S DE RL MI" => "", ;
"SCL" => "", ;
"S.P.R. DE R.L" => "", ;
"S.DE PR DE RL" => "", ;
"S.T.P.R.M" => "", ;
"S DE RL DE CV" => "", ;
"S.P.R. DE R.L." => "", ;
"SC DE RL DE C.V." => "", ;
"S. DE R.L. M.L." => "", ;
",S.DE R.L. MI." => "", ;
"S.P.R. DE R.L. DE C.V." => "", ;
"S.P.R. DE R.L. DE C.V." => "" } )

Si tienes alguna otra idea te agradezco.

Saludos,
Javier
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Reemplazar cadena dentro de un nombre

Post by SALINETAS24 »

jparada wrote: Thu Oct 20, 2022 2:37 pm

Si tienes alguna otra idea te agradezco.

Saludos,
Javier
Hola Javier...
Después de analizar un poco la "justilla" información que nos has pasado, te comento

Code: Select all

", S DE RL DE C.V" => "", ;
"S DE R L DE CV" => "", ; 
"S. DE P.R. DE R.L" => "", ; 
"SPR DE RL DE CV" => "", ;
"SAPI DE C.V." => "", ; 
"S A B DE C.V." => "", ;
"S.C." => "", ;
"S.C" => "", ; 
"S DE RL MI" => "", ;
"SCL" => "", ; 
"S.P.R. DE R.L" => "", ; 
"S.DE PR DE RL" => "", ;                                // ESTA LINEA
"S.T.P.R.M" => "", ; 
"S DE RL DE CV" => "", ; 
"S.P.R. DE R.L." => "", ;                                // ESTA LINEA
"SC DE RL DE C.V." => "", ;
"S. DE R.L. M.L." => "", ;
",S.DE R.L. MI." => "", ;
"S.P.R. DE R.L. DE C.V." => "", ;                    // ESTA LINEA 
"S.P.R. DE R.L. DE C.V." => "" } )
El comando Hb_StrReplace funciona de manera secuencial. Esto es va desde la 1 comparación hasta la ultima y las ejecuta en tiempo real, por lo que tienes que ser muy cuidadoso a la hora de solicitar los cambios.
Por ejemplo, en la lista que nos has pasado tienes estos cambios
"S.P.R. DE R.L." => "", ;
y lineas más abajo tienes
"S.P.R. DE R.L. DE C.V."

Imagínate ahora que tienes el nombre
"SALINETAS24 y OLE S.P.R. DE R.L. DE C.V."
cuando ejecutes el programa el resultado que obtendrás sera
"SALINETAS24 y OLE DE C.V."....
porque primero ejecuta la comparación "S.P.R. DE R.L." y esta cadena esta dentro del nombre, cuando llega a la segunda comparación la cadena ya no existe, ha sido modificada.
Craso error amigo Sancho!!.


Solución.....
ORDENA LAS COMPARACIONES POR SU LONGITUD. LAS MAS LARGAS PRIMERO.
Quedaría algo como esto

Code: Select all

"S.P.R. DE R.L. DE C.V." => "", ;
"S. DE P.R. DE R.L" => "", ; 
", S DE RL DE C.V" => "", ;
"SC DE RL DE C.V." => "", ;
"S. DE R.L. M.L." => "", ;
"SPR DE RL DE CV" => "", ;
"S DE R L DE CV" => "", ; 
"S.P.R. DE R.L." => "", ;
",S.DE R.L. MI." => "", ;
"S.DE PR DE RL" => "", ;
"S.P.R. DE R.L" => "", ; 
"S DE RL DE CV" => "", ; 
"S A B DE C.V." => "", ;
"SAPI DE C.V." => "", ; 
"S DE RL MI" => "", ;
"S.T.P.R.M" => "", ; 
"S.C." => "", ;
"S.C" => "", ; 
"SCL" => "", ; 
Espero que con este lo tengas solucionado, vamos con una cervecita fresquita que esta ronda la pago yo.
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
franco
Posts: 889
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

Re: Reemplazar cadena dentro de un nombre

Post by franco »

Don`t you sip scotch whiskey.
All The Best,
Franco
Canada
jparada
Posts: 433
Joined: Fri Jan 23, 2009 5:18 pm

Re: Reemplazar cadena dentro de un nombre

Post by jparada »

SALINETAS24 wrote: Thu Oct 20, 2022 7:23 pm Imagínate ahora que tienes el nombre
"SALINETAS24 y OLE S.P.R. DE R.L. DE C.V."
cuando ejecutes el programa el resultado que obtendrás sera
"SALINETAS24 y OLE DE C.V."....
porque primero ejecuta la comparación "S.P.R. DE R.L." y esta cadena esta dentro del nombre, cuando llega a la segunda comparación la cadena ya no existe, ha sido modificada.
Craso error amigo Sancho!!.

Solución.....
ORDENA LAS COMPARACIONES POR SU LONGITUD. LAS MAS LARGAS PRIMERO.

Quedaría algo como esto
Espero que con este lo tengas solucionado, vamos con una cervecita fresquita que esta ronda la pago yo.
Hola José, el problema que mencionas es justo lo que me sucede, ahora con tu explicación, realicé los cambios, funciona un poco mejor, pero sigue dejando nombres sin resolver (muchos), imagino que algunos caracteres serán excluyentes o si tienen la misma longitud, cuál poner primero, etc.

Tal vez para este caso no vale utilizar hb_StrReplace y sería darle la vuelta de otra forma, también he intentado con:

Code: Select all

if "SA. DE CV." $ cNombre
 nombre := StrTran( cnombre, "SA. DE CV.", ""  )
pero eso tampoco me funciona...

Te acepto con mucho gusto las primeras rondas de 🍺, me urgen porque estoy a nada de tirar la toalla con este procedimiento.

PS: La lista completa queda así:

Code: Select all

completo := hb_StrReplace( nombrecliente, { ;
          "S. DE P.R. DE . R.L. DE C.V" => "", ;
          "S. DE P.R. DE R.L. DE C.V" => "", ;
          "S DE P.R. DE R.L. DE C.V." => "", ;
          "S.P.R. DE R.L. DE C.V." => "", ;
          "S.P.R. DE R.L DE C.V." => "", ;
          "S.R.L. DE I.P. DE C.V" => "", ;  // nuevo
          "S. A. P. I. DE C.V." => "", ; // nueva
          "SPR DE R.L. DE C.V." => "", ; // nueva
          "S. DE P.R. DE R.L." => "", ;
          "S. DE R.L. DE C.V." => "", ;
          "S. DE P.R. DE R.L" => "", ;
          "SPR DE R.L DE C.V" => "", ;  // nuevo
          "SPR DE RL DE C.V." => "", ;          // nueva
          "S. DE R.L DE C.V." => "", ;
          "S DE P.R. DE R.L." => "", ;  // nuevo 1920
          "S. DE RL. DE C.V." => "", ; // nuevo
          "S DE R.L. DE C.V." => "", ;  // nuevo
          "S. DE R.L. DE C.V" => "", ;
          "SPR DEL RL DE CV" => "", ;  // nueva          
          "S.P.R.L. DE C.V." => "", ;  // nuevo
          "S. DE PR DE R.L." => "", ;  // nueva
          "S. A. S. DE C.V." => "", ;          
          "S DE R.L. DE C.V" => "", ;          
          ", S DE RL DE C.V" => "", ;
          "SC DE RL DE C.V." => "", ;          
          ", S. DE R.L. MI." => "", ; // nueva
          ",S A P I DE C V" => "", ; // nueva          
          "S.A.P.I DE C.V." => "", ; // nueva          
          "SPR DE RL DE CV" => "", ;
          "S. DE R.L. M.L." => "", ;          
          "S.DE R.L DE C.V" => "", ;  // nueva
          "S.R.L. DE C.V." => "", ;
          ", S.A. DE C.V." => "", ;
          "S DE R L DE CV" => "", ;
          "S.P.R. DE R.L." => "", ;          
          ",S.DE R.L. MI." => "", ;
          "SC DE RL DE CV" => "", ; // nuevo
          "S DE RL DE C.V" => "", ; // nuevo
          "S A P I DE CV" => "", ; // nuevo
          "SAPI  DE C.V." => "", ; // nuevo
          ",SAPI DE C.V." => "", ; // nueva
          ",S.A. DE C.V." => "", ;
          "S.P.R DE R.L." => "", ;  // nueva
          ",S.A. DE.C.V." => "", ; // nueva
          ", S.A. DE.C.V" => "", ;
          "S A B DE C.V." => "", ;          
          "S.P.R. DE R.L" => "", ;
          "S.DE PR DE RL" => "", ;
          "S DE PR DE RL" => "", ;  // nuevo          
          "S DE RL DE CV" => "", ;
          ". DE RL DE CV" => "", ; // agregado 1466
          ".S.A.DE C.V." => "", ;          
          "S.A. DE C.V." => "", ;
          ", S.A DE C.V" => "", ;          
          ",S.A.DE C.V." => "", ;
          "SAPI DE C.V." => "", ;          
          ", SA DE CV." => "", ;
          "S.A.DE C.V." => "", ;          
          "S.A. DE. CV" => "", ; // nueva
          "S.A DE C.V." => "", ;
          "S.A. DE C.V" => "", ;          
          "S.A DE C.V." => "", ;
          "S.A.DE.C.V" => "", ; // nuevo 1635
          "SAPI DE CV" => "", ; // nueva 
          "S.A.DEC.V." => "", ;  // nuevo 
          "SA. DE CV." => "", ;
          "S.A DE C.V" => "", ;  
          ",SPR DE RL" => "", ; // nueva
          "S. DE R.L." => "", ; // nueva
          "SPR DE RL." => "", ;
          "S DE RL MI" => "", ;          
          ",SA DE C.V" => "", ;          // nuevo 1629
          "S.A DE CV" => "", ;
          "SPR DE RL" => "", ; // nuevo  2220          
          ",SA.DE CV" => "", ;          
          "SA DE CV." => "", ;
          "S.A. DE C" => "", ;
          "S.T.P.R.M" => "", ;
          "SA DE CV" => "", ;
          "S.A DE C" => "", ;
          "S.A. DE" => "", ;          
          "S DE RL" => "", ;
          "S.C.L." => "", ; // NUEVO
          ", S.C." => "", ; // agregué esta cliente 1222
          "A.C." => "", ;
          "S.A." => "", ; // agregué esta cliente 0755
          "S.C." => "", ;
          "S.C" => "", ;          
          "SCL" => ""  } )
Saludos,
Javier
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Reemplazar cadena dentro de un nombre

Post by andyglezl »

jparada wrote: Thu Oct 20, 2022 2:37 pm
Hola Andrés,
............
Entonces el proceso que intento realizar es leer cada nombre de cliente, ver si contiene la cadena de caracteres que puede ser muy variada y quitar toda esa cadena, es decir, recorrer los nombres de clientes:

JAVIER PARADA SA DE CV ---> quitar SA DE CV y dejar JAVIER PARADA
NOMBRE DE CLIENTE2,SA DE CV ---> quitar ,SA DE CV y dejar NOMBRE DE CLIENTE2
OTRO CLIENTE, S.A DE CV. ---> quitar , S.A DE CV. y dejar OTRO CLIENTE y así...
...........
Si tienes alguna otra idea te agradezco.

Saludos, Javier



Por lo que entiendo, no es un proceso que estés haciendo continuamente, sino que
estás leyendo un BDF y lo quieres convertir suprimiendo lo anterior.
( o sea, que el tiempo que tome, no debería importar )


Es solo una idea, no lo he probado...

Code: Select all

	aDatoABuscar := { ", SA DE CV.", ;
					 "SA. DE CV.", ;
					 "S.A DE CV", ;
					 "S.A.DE C.V.", ;
					 "S.A DE C.V.", ;
					 ".S.A.DE C.V.", ;
					 "S.A. DE C.V.", ;
					 ",S.A. DE C.V.", ;         
					 ", S.A. DE C.V.", ;
					 "S.A DE C.V", ;
					 "S.A. DE C.V", ;
					 "SA DE CV", ;
					 ",SA.DE CV",  ;
					 "SA DE CV.", ;
					 ", S.A DE C.V", ;
					 "S.A DE C.V.", ;         
					 ", S.A. DE.C.V", ;         
					 "S.A. DE C", ;
					 "S.A DE C", ;
					 "S.A. DE" 
					 ", S DE RL DE C.V", ;
					 "S DE R L DE CV", ;         
					 "S. DE P.R. DE R.L", ;         
					 "SPR DE RL DE CV", ;
					 "SAPI DE C.V.", ;         
					 "S A B DE C.V.", ;
					 "S.C.", ;
					 "S.C", ;         
					 "S DE RL MI", ;
					 "SCL", ;         
					 "S.P.R. DE R.L", ;         
					 "S.DE PR DE RL", ;
					 "S.T.P.R.M", ;         
					 "S DE RL DE CV", ;         
					 "S.P.R. DE R.L.", ;
					 "SC DE RL DE C.V.", ;
					 "S. DE R.L. M.L.", ;
					 ",S.DE R.L. MI.", ;
					 "S.P.R. DE R.L. DE C.V." }
					 
					 
	USE algun.dbf
	DbGoTop()
	DO WHILE NOT EOF()
		For i1 = 1 TO HMG_LEN( aDatoABuscar )
			nombreCfdi4 := Hb_StrReplace( cliente->name, { aDatoABuscar[ i1 ] => '' } )
		Next
		SKIP
	ENDDO
Andrés González López
Desde Guadalajara, Jalisco. México.
edk
Posts: 999
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: Reemplazar cadena dentro de un nombre

Post by edk »

¿Podría preparar un archivo de nombre de cliente con tantos ejemplos como sea posible? Tal vez intentemos la tokenización, pero necesito tener tantos ejemplos de diferentes variaciones de nombres de clientes con sus vecindarios como sea posible.
franco
Posts: 889
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

Re: Reemplazar cadena dentro de un nombre

Post by franco »

My code line worked

Code: Select all

 nombre := StrTran( cnombre, "SA. DE CV.", ""  )    // your`s

nombre:=Hb_StrReplace(cnombre,{"SA. DE CV." =>"" })   // mine
I agree with Edward. Please send cnombre list and the character strings. This way we can test and hopefully create a solution.

I am having trouble to create an array and then use each item as a character string.
I tried building an array of strings then loop though the table
like

Code: Select all

array[1] := 'SA, DE CV."
C := ARRAY[1]
cnombre:=Hb_StrReplace(nombre,{C=>"" })             // nombre is table main field, cnombre is replaced field
C does not become exactly the same as array[1]
All The Best,
Franco
Canada
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Reemplazar cadena dentro de un nombre

Post by SALINETAS24 »

jparada wrote: Thu Oct 20, 2022 9:25 pm
Hola José, el problema que mencionas es justo lo que me sucede, ahora con tu explicación, realicé los cambios, funciona un poco mejor, pero sigue dejando nombres sin resolver (muchos),....
Javier
Hola Javier, creo que tienes que tener algún problema con tu fichero, estaría bien como dice EDK que preparases una DBF con todos los registros posibles para poder probar.
Yo por mi parte he probado con una tabla, le he puesto datos a lo loco, incluso alguno de ellos con mala leche y me los cambia todos.
Te paso el programa en cuestión.
Attachments
cambiar.rar
(1.46 KiB) Downloaded 162 times
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
franco
Posts: 889
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

Re: Reemplazar cadena dentro de un nombre

Post by franco »

Hi, SL2,
I have not been able to make your code( Not work).
Now it would be nice to look at the real table and real variables from jparada.
Franco
All The Best,
Franco
Canada
jparada
Posts: 433
Joined: Fri Jan 23, 2009 5:18 pm

Re: Reemplazar cadena dentro de un nombre

Post by jparada »

Hola,
Agradezco a todos los que amablemente intentaron ayudarme, el proceso que intento es leer un archivo Excel, realizar la sustitución y escribir el nuevo nombre en una columna, así que originalmente tenía algo como esto:

Code: Select all

For i := 2 To nFilas
  nombreCliente   := Cell2Chr( oHoja:cells(i,3):value )

  nuevoNombre := hb_StrReplace( nombrecliente, { ;
  	        "S. DE P.R. DE . R.L. DE C.V" => "", ;
                "S. DE P.R. DE R.L. DE C.V" => "", ;
                "S DE P.R. DE R.L. DE C.V." => "", ;
                "S.P.R. DE R.L. DE C.V." => "", ;
                "S.P.R. DE R.L DE C.V." => "", ;

  oHoja:cells(i,4):Value := Alltrim(completo)
Ya había intentado algo parecido con el código de Andrés y con el código de José lo intenté tal cual, algo así:

Code: Select all

For i := 2 to nFilas
    nombreCliente   := Cell2Chr( oHoja:cells(i,3):value )

    AADD( aDatos, nombreCliente )
Next

nDatos := Len(aDatos)
For nFor = 1 TO nDatos
  nombrecliente := aDatos[nFor]

  nombrecliente := hb_StrReplace( aDatos[nFor], { ;
		 "S. DE P.R. DE . R.L. DE C.V" => "", ;
		 "S. DE P.R. DE R.L. DE C.V." => "", ;
		 "S. DE P.R. DE R.L. DE C.V" => "", ;
		 "S DE P.R. DE R.L. DE C.V." => "", ;
		 ", S.P.R. DE R.L. DE C.V." => "", ;
		 "S. P.R. DE R.L. DE C.V." => "", ;
		 "S.P.R. DE R.L. DE C.V." => "", ;

  oHoja:cells(nFor+1,4):Value := Alltrim(nombrecliente)
Next
Y al parecer esto, más agregar la lista de caracteres en el orden correcto, está funcionando correctamente 🎉!!

Aprecio la ayuda de todos, Franco and Edward I appreciate your help, for the moment it's working properly.

Saludos/Regards,
Javier
Post Reply