Page 2 of 2

Re: Reemplazar cadena dentro de un nombre

Posted: Thu Oct 20, 2022 2:37 pm
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

Re: Reemplazar cadena dentro de un nombre

Posted: Thu Oct 20, 2022 7:23 pm
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.

Re: Reemplazar cadena dentro de un nombre

Posted: Thu Oct 20, 2022 8:02 pm
by franco
Don`t you sip scotch whiskey.

Re: Reemplazar cadena dentro de un nombre

Posted: Thu Oct 20, 2022 9:25 pm
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

Re: Reemplazar cadena dentro de un nombre

Posted: Thu Oct 20, 2022 9:38 pm
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

Re: Reemplazar cadena dentro de un nombre

Posted: Thu Oct 20, 2022 10:07 pm
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.

Re: Reemplazar cadena dentro de un nombre

Posted: Thu Oct 20, 2022 11:18 pm
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]

Re: Reemplazar cadena dentro de un nombre

Posted: Fri Oct 21, 2022 3:38 am
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.

Re: Reemplazar cadena dentro de un nombre

Posted: Fri Oct 21, 2022 7:50 pm
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

Re: Reemplazar cadena dentro de un nombre

Posted: Fri Oct 21, 2022 10:06 pm
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