Remplazar texto o caracteres de una palabra

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
melvinhn
Hacker del Foro
Mensajes: 75
Registrado: 16 Jul 2011, 22:14
Ubicación: Honduras, Cortes, Puerto Cortes, Col Miraflores
Contactar:

Remplazar texto o caracteres de una palabra

Mensaje por melvinhn »

Tengo el siguiente codigo...

Código: Seleccionar todo

$text = StringReplace("123", "1", "h")
MsgBox(0, "Remplazar", $text)
la logica que me presenta es que en el 123 va quedar asi h23

pero como haria para remplazar el 2 y el 3 como por ejemplo 2=p y 3=f para que me presente el siguieente resultado 123=hp3
Avatar de Usuario
melvinhn
Hacker del Foro
Mensajes: 75
Registrado: 16 Jul 2011, 22:14
Ubicación: Honduras, Cortes, Puerto Cortes, Col Miraflores
Contactar:

Re: Remplazar texto o caracteres de una palabra

Mensaje por melvinhn »

Error de dedo

pero como haria para remplazar el 2 y el 3 como por ejemplo 2=p y 3=f para que me presente el siguieente resultado 123=hpf
avechuche
Hacker del Foro
Mensajes: 188
Registrado: 13 Ago 2009, 09:53

Re: Remplazar texto o caracteres de una palabra

Mensaje por avechuche »

A ver si entendi lo que queres es lograr pasar de 123 a hpf? Si es asi es facil

Código: Seleccionar todo

$text = StringReplace("123", "1", "h")
$text = StringReplace($text , "2", "p")
$text = StringReplace($text , "3", "f")

ConsoleWrite($text & @CRLF)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Remplazar texto o caracteres de una palabra

Mensaje por Ximorro »

Efectivamente, no hay más remedio que hacer uno a uno. Yo también he tenido que hacer esto alguna vez y no he encontrado una manera más compacta :smt017 Si alguien conoce alguna ya lo está poniendo.

Si tienes que hacer muchos cambios, principalmente si hay que hacer muchos StringReplace pero quizás también si lo aplicas a cadenas muy largas, entonces yo uso otra idea: Recorro la cadena carácter a carácter y voy sustituyendo cada uno si hace falta.

La sustitución se puede hacer con un Switch comprobando carácter a carácter los que hay que cambiar:

Código: Seleccionar todo

$cadena = "2152938742593812341"
$res = ""
For $i = 1 To StringLen($cadena)
	$caracter = StringMid($cadena, $i, 1)
	Switch $caracter
		Case "1"
			$caracter = "h"
		Case "2"
			$caracter = "p"
		Case "3"
			$caracter = "f"
	EndSwitch
	$res &= $caracter
Next
ConsoleWrite($res & @CRLF)
Cuando cambia muchísimo, por ejemplo una sustitución de todo el alfabeto, para evitar el Switch tan largo se puede hacer con diccionarios, que te asocian los pares de sustitución, pero eso es bastante más complejo pues hay que usar objetos de Windows que no son nativos de AutoIt.
Pero eso ya sería para cosas masivas. Si son unas pocas sustituciones usa el método de avevhuche, si ves que empieza a crecer el segundo método es más interesante porque sólo recorre la cadena una vez.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
melvinhn
Hacker del Foro
Mensajes: 75
Registrado: 16 Jul 2011, 22:14
Ubicación: Honduras, Cortes, Puerto Cortes, Col Miraflores
Contactar:

Re: Remplazar texto o caracteres de una palabra

Mensaje por melvinhn »

Muchas gracias... por su ayuda brinda

Vale recalcar que sin la ayuda de ustedes un novato no dejaria de ser novato..

Muchas gracias los dos ejemplos me han servido de mucho y era justo lo que queria...
Avatar de Usuario
melvinhn
Hacker del Foro
Mensajes: 75
Registrado: 16 Jul 2011, 22:14
Ubicación: Honduras, Cortes, Puerto Cortes, Col Miraflores
Contactar:

Re: Remplazar texto o caracteres de una palabra

Mensaje por melvinhn »

Bueno resulta que me encontre con el siguiente problema

Código: Seleccionar todo

$cadena = "HOL hol"
$res = ""
For $i = 1 To StringLen($cadena)
$caracter = StringMid($cadena, $i, 1)
Switch $caracter
Case "H"
$caracter = "p"
Case "O"
$caracter = "a"
Case "L"
$caracter = "r"
;Ahora con las minusculas
Case "h"
$caracter = "P"
Case "o"
$caracter = "A"
Case "l"
$caracter = "R"
EndSwitch
$res &= $caracter
Next
ConsoleWrite($res & @CRLF)
la respuesta que me da es (par par)

pero la respues correcta seria (par PAR)
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Remplazar texto o caracteres de una palabra

Mensaje por Ximorro »

¡Menuda sorpresa!
Pues resulta que en AutoIt hay dos tipos de comparadores con cadenas, el "=" no tiene en cuenta el caso (mayúsculas/minúsculas), si quieres tenerlo en cuenta hay que usar el operador "=="
Así que "abc" = "ABC" es cierto, pero "abc" == "ABC" es falso.
Lo que no sabía, y que comprobamos con tu código es que el Switch hace las comparaciones sin ser caso sensitivo.

Pregunta para la comunidad: ¿HAY ALGUNA MANERA DE HACER QUE SWITCH HAGA COMPARACIONES DE CADENA CASO SENSITIVO?

Se me ocurren dos soluciones:
1) Usar Select en vez de Switch. Cuando son equivalentes me gusta más el segundo porque es más compacto, pero en este caso no son equivalentes porque en el Select pones la comparación a mano, con lo que podemos especificar que queremos el operador "==":

Código: Seleccionar todo

$cadena = "HOL hol"
$res = ""
For $i = 1 To StringLen($cadena)
	$caracter = StringMid($cadena, $i, 1)
	Select
		Case $caracter == "H"
			$caracter = "p"
		Case $caracter == "O"
			$caracter = "a"
		Case $caracter == "L"
			$caracter = "r"
		;Ahora con las minusculas
		Case $caracter == "h"
			$caracter = "P"
		Case $caracter == "o"
			$caracter = "A"
		Case $caracter == "l"
			$caracter = "R"
	EndSelect
	$res &= $caracter
Next
ConsoleWrite($res & @CRLF)
2) La otra manera que se me ocurre es usar los valores numéricos de los caracteres, su código ASCII, al ser números no se ven afectador por el tipo de comparación. No hace falta poner los números a mano, que también valdría, pero simplemente podemos decir a AutoIt que lo calcule con la función Asc(). En este caso si no hay sustitución por ejemplo recompongo el código ASCII al carácter original usando la función Chr() en el Case Else (se podría hacer de otra manera, como guardando el caracter inicial antes de hacerle el Asc())

Código: Seleccionar todo

$cadena = "HOL hol"
$res = ""
    For $i = 1 To StringLen($cadena)
    $caracter = Asc(StringMid($cadena, $i, 1))
		Switch $caracter
		Case Asc("H")
			$caracter = "p"
		Case Asc("O")
			$caracter = "a"
		Case Asc("L")
			$caracter = "r"
		;Ahora con las minusculas
		Case Asc("h")
			$caracter = "P"
		Case Asc("o")
			$caracter = "A"
		Case Asc("l")
			$caracter = "R"
		Case Else
			$caracter = Chr($caracter)
    EndSwitch
    $res &= $caracter
    Next
ConsoleWrite($res & @CRLF)
Por cierto, ¿no dirías que mis códigos indentados se leen mejor que el tuyo que empieza todo al principio de la línea? Al hacerlo como yo se ve claramente de dónde a donde van los bucles, condicionales, funciones, etc... Te recomiendo hacerlo así, de lo contrario los programas se pueden hacer muy complicados de leer, casi imposible cuando empiezan a encadenar If, While y compañía.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
melvinhn
Hacker del Foro
Mensajes: 75
Registrado: 16 Jul 2011, 22:14
Ubicación: Honduras, Cortes, Puerto Cortes, Col Miraflores
Contactar:

Re: Remplazar texto o caracteres de una palabra

Mensaje por melvinhn »

Bueno muchas gracias por tu ayuda, tendre presente la ordenacion del codigo desde hoy en adelante. me quede con el segundo ejemplo
Responder