[R] Changer un symbole sur deux
Règles du forum
- Merci de consulter la section "Règles du forum" et plus particulièrement "Règles et Mentions Légales du site autoitscript.fr" avant d'écrire un message.
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
[R] Changer un symbole sur deux
Bonjour,
Je souhaite réaliser un truc qui me semble assez simple mais je n'ai pour l'instant pas trouvé de solution.
J'ai une ligne de texte de type :
1;2;3;4;5;6;7;8;9;10
Je souhaiterais changer un ; sur 2 par un autre symbole (exemple @)
Ce qui donnerait :
1;2@3;4@5;6@7;8@9;10
Comment pourrais je réaliser cela ?
Merci
Je souhaite réaliser un truc qui me semble assez simple mais je n'ai pour l'instant pas trouvé de solution.
J'ai une ligne de texte de type :
1;2;3;4;5;6;7;8;9;10
Je souhaiterais changer un ; sur 2 par un autre symbole (exemple @)
Ce qui donnerait :
1;2@3;4@5;6@7;8@9;10
Comment pourrais je réaliser cela ?
Merci
Modifié en dernier par Tlem le mar. 31 mars 2009 11:55, modifié 2 fois.
Raison : Ajout de la balise [..] dans le titre
Raison : Ajout de la balise [..] dans le titre
- Tlem
- Site Admin

- Messages : 11816
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Comme ceci :
De rien ... 
Code : Tout sélectionner
$Str = "1;2;3;4;5;6;7;8;9;10"
For $i = 4 To StringLen($Str) Step 4
$Str = StringReplace($Str, $i, "@")
Next
MsgBox(0, "", $Str)Thierry
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
-
ani
- Niveau 11

- Messages : 1826
- Enregistré le : lun. 23 juil. 2007 12:31
- Localisation : Bureau
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
c'est une idée, mais il changera le dernier caractère en @ en l'occurance le zero du 10
edit:après teste, c'est effectivement ce que je viend de dire.
hm pas évident tout çà
un numéro + séparateur + un numéro & remplacement du séparateur, vais essayer mais je promet rien
edit:après teste, c'est effectivement ce que je viend de dire.
hm pas évident tout çà
un numéro + séparateur + un numéro & remplacement du séparateur, vais essayer mais je promet rien
- Iste
- Niveau 11

- Messages : 1870
- Enregistré le : jeu. 04 déc. 2008 14:21
- Localisation : 76
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Ben, on découpe tout et on recolle ?
(changer $change en 0 pour inverser)
Edit :
petite modif qui evite de rajouter un separateur a la fin :
Code : Tout sélectionner
$coupe = StringSplit("1;2;3;4;kikoolol;5;6;7;8;9;10",";")
$change = 1
$colle = ""
For $i = 1 To $coupe[0]
If $change Then
$colle = $colle & $coupe[$i] & ";"
$change = 0
Else
$colle = $colle & $coupe[$i] & "@"
$change = 1
EndIf
Next
MsgBox("","",$colle)Edit :
petite modif qui evite de rajouter un separateur a la fin :
Code : Tout sélectionner
$coupe = StringSplit("1;2;3;4;kikoolol;5;6;7;8;9;10",";")
$change = 1
$colle = ""
For $i = 1 To $coupe[0]
If $change Then
If $i < $coupe[0] Then
$colle = $colle & $coupe[$i] & ";"
Else
$colle = $colle & $coupe[$i]
EndIf
$change = 0
Else
If $i < $coupe[0] Then
$colle = $colle & $coupe[$i] & "@"
Else
$colle = $colle & $coupe[$i]
EndIf
$change = 1
EndIf
Next
MsgBox("","",$colle)Signez ici
Re: [..] Changer un symbole sur deux
Code : Tout sélectionner
$Str = "1;2;3;4;5;6;7;8;9;10"
$str=StringReplaceFreq($str,";","@",2)
#cs
StringReplaceFreq
retourne :
String si reussi
1 si le caractére à chercher n'est pas de la même longueur que celui à ajouter.
parametres:
$string: chaine à traiter
$toFind: Caractére à chercher
$toReplace: Caractére à ajouter
$howMany: Frequence du remplacement
#ce
func StringReplaceFreq($string,$toFind,$toReplace,$howMany)
if StringLen($toFind) <> StringLen($toReplace) then return 1
local $i,$count=0
for $i=0 To StringLen($string)
if StringCompare(StringMid($string,$i,stringlen($toFind)),$toFind) == 0 then $count+=1
if $count >= $howMany then
$string=StringReplace($string,$i,$toReplace)
$count=0
EndIf
next
return $string;
EndFunc
MsgBox(0, "", $Str)Comme ça on est ni river au caractére ";" ni à la fréquence des remplacements \o/
-
ani
- Niveau 11

- Messages : 1826
- Enregistré le : lun. 23 juil. 2007 12:31
- Localisation : Bureau
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
whouaaaaa super fonction et hop a rajouter 
merci voodoo
j'ai pas mieux à proposer je partais sur (\d;\d*) et grr
merci voodoo
j'ai pas mieux à proposer je partais sur (\d;\d*) et grr
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Bonjour à tous et merci de vous être penché sur le problème.
La solution de VooDoo est effectivement intéressante.
N'étant pas encore aussi calé j'étudie doucement ce code.
Pouvez vous me rapeller ce que signifie == et += (je connais par contre <> qui signifie différent).
Par contre avec cette méthode il faut que le caractère à chercher et celui à remplacer soit de la même longueur.
Dans certain cas je dois remplacer un ; par deux ou trois caractères.
J'ai aussi essayé de supprimer un caractère sur deux avec cette méthode mais apparement on ne peut pas mettre rien comme caractère de remplacement.
(ne fonctionne pas).
Merci beaucoup pour votre aide.
La solution de VooDoo est effectivement intéressante.
N'étant pas encore aussi calé j'étudie doucement ce code.
Pouvez vous me rapeller ce que signifie == et += (je connais par contre <> qui signifie différent).
Par contre avec cette méthode il faut que le caractère à chercher et celui à remplacer soit de la même longueur.
Dans certain cas je dois remplacer un ; par deux ou trois caractères.
J'ai aussi essayé de supprimer un caractère sur deux avec cette méthode mais apparement on ne peut pas mettre rien comme caractère de remplacement.
Code : Tout sélectionner
$str=StringReplaceFreq($str,";","",2)Je ne l'avais pas précisé mais c'était effectivement important parce que le texte peut contenir des mots de taille variable et contenir des nombres de ; différent d'un texte à l'autre.Comme ça on est ni river au caractére ";" ni à la fréquence des remplacements
Merci beaucoup pour votre aide.
Re: [..] Changer un symbole sur deux
== signifie = en étant "case sensitive" si tu compares des string. C'est à dire que "ok" est différent de "Ok" ou "oK". (dans ma fonction ce n'est pas utile puisque l'on compare à 0, c'est juste une habitude que j'ai prise
)
$count+=1 équivaut a $count=$count+1
Pour la liste des operators regarde ici
Effectivement $str=StringReplaceFreq($str,";","",2) ne fonctionne pas car ce n'est pas de la même longueur, pour cela il faut tricher avec un $str=StringReplaceFreq($str,";",chr(0),2).
$count+=1 équivaut a $count=$count+1
Pour la liste des operators regarde ici
Effectivement $str=StringReplaceFreq($str,";","",2) ne fonctionne pas car ce n'est pas de la même longueur, pour cela il faut tricher avec un $str=StringReplaceFreq($str,";",chr(0),2).
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Merci pour le lien vers les opérateurs.
Dans l'exemple donné cela retourne seulement :
1;2
Ca n'a pas l'air de fonctionner.Effectivement $str=StringReplaceFreq($str,";","",2) ne fonctionne pas car ce n'est pas de la même longueur, pour cela il faut tricher avec un $str=StringReplaceFreq($str,";",chr(0),2).
Dans l'exemple donné cela retourne seulement :
1;2
Re: [..] Changer un symbole sur deux
exact, bon c'est du bidouillage de toute façon mais si tu mets Chr(28) la sa marche !
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
C'est effectivement de la bidouille mais je cherche un moyen aussi de remplacer un Chr(34) & ";" & Chr(34) par un @.
Le chr(0) correspond apparement à une fin de chaine de caractère d'ou l'arrêt après le 2.
Le chr(28) est semble t il une sorte d'espace insécable donc c'est pas tout à fait ça.
C'est pas si simple ce truc finalement.
Le chr(0) correspond apparement à une fin de chaine de caractère d'ou l'arrêt après le 2.
Le chr(28) est semble t il une sorte d'espace insécable donc c'est pas tout à fait ça.
C'est pas si simple ce truc finalement.
- Iste
- Niveau 11

- Messages : 1870
- Enregistré le : jeu. 04 déc. 2008 14:21
- Localisation : 76
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Avec mon code tu peux remplacer par ce que tu veux !
par contre, il est surement moin optimisé, donc si ton code doit etre rapide, prend pas cette solution.
Code : Tout sélectionner
$string = "1;2;3;4;kikoolol;5;6;7;8;9;10"
$Remplacer = ";"
$par = "YMCA"
$coupe = StringSplit($string,$Remplacer,1) ;Cette ligne découpe la chaine et met chaque petit bout dans une array. [0] contien le nombre de petits bout, et le ,1 a la fin signifit que le separteur est TOUT ce qu'il y a ecris (par defaut, si on lui donne ",;:" comme separateur, il découpe a chaque "," ou ";" ou ":")
$change = 1 ;ca c'est juste un boléen qui dit "on change" ou "on change pas" pour modifier un caractere ur deux
$colle = "" ;heu... ben c'est le resultat, mais pour le moment c'est vide...
For $i = 1 To $coupe[0] ;On lit chaque petit bout découpé
If $change Then ;Si $change est sur 1, on change le separateur
If $i < $coupe[0] Then ;si c'est le dernier petit bout, on met pas de separateur a la fin
$colle = $colle & $coupe[$i] & $Remplacer ; on rajoute le bout de chaine a la suite des autre, et on place le separateur
Else ;si on est a la fin,
$colle = $colle & $coupe[$i] ; on rajoute le bout de chaine a la suite des autre, et on place pas le separateur vu qu'on est a la fin
EndIf
$change = 0 ;on previen que le prochain faudra pas changer
Else ;si on change pas, on colle le bout lu suivit du separateur normal
If $i < $coupe[0] Then ;si c'est le dernier petit bout, on met pas de separateur a la fin
$colle = $colle & $coupe[$i] & $par ; on rajoute le bout de chaine a la suite des autre, et on place le separateur normal
Else ;si on est a la fin,
$colle = $colle & $coupe[$i] ; on rajoute le bout de chaine a la suite des autre, et on place pas le separateur vu qu'on est a la fin
EndIf
$change = 1 ;et la on dit que le prochain on le change
EndIf
Next
MsgBox("","",$colle)
Modifié en dernier par Iste le lun. 23 mars 2009 18:20, modifié 1 fois.
Signez ici
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Merci Iste pour ce code que j'ai un peu plus de mal à comprendre.
Je l'ai testé et il fonctionne sur mon exemple simple mais ne semble pas accepter plus d'un caractère pour le séparateur.
Si je prend comme exemple :
J'obtiens :
1;;@@2;;@@3;;@@4;;@@5;;@@6;;@@7;;@@8;;@@9;;@@10;;
Eh ben je n'imaginais pas que c'étais aussi compliqué de faire cela
Je l'ai testé et il fonctionne sur mon exemple simple mais ne semble pas accepter plus d'un caractère pour le séparateur.
Si je prend comme exemple :
Code : Tout sélectionner
$str = ("1;;2;;3;;4;;5;;6;;7;;8;;9;;10;")
$Remplacer = ";;"
$par = "@@"
$coupe = StringSplit($str,$Remplacer)
$change = 1
$colle = ""
For $i = 1 To $coupe[0]
If $change Then
If $i < $coupe[0] Then
$colle = $colle & $coupe[$i] & $Remplacer
Else
$colle = $colle & $coupe[$i]
EndIf
$change = 0
Else
If $i < $coupe[0] Then
$colle = $colle & $coupe[$i] & $par
Else
$colle = $colle & $coupe[$i]
EndIf
$change = 1
EndIf
Next
MsgBox("","",$colle)1;;@@2;;@@3;;@@4;;@@5;;@@6;;@@7;;@@8;;@@9;;@@10;;
Eh ben je n'imaginais pas que c'étais aussi compliqué de faire cela
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
C'est pas trop grave, je pense garder la version de VooDoo
Je ferais un :
Et si j'ai besoin de mettre par exemple 2 @ je rajouterais un :
Je ferais un :
Code : Tout sélectionner
$str=StringReplaceFreq($str,";","@",2)Code : Tout sélectionner
StringReplace ($str,"@","@@")- Iste
- Niveau 11

- Messages : 1870
- Enregistré le : jeu. 04 déc. 2008 14:21
- Localisation : 76
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
oui non, j'ai oublié un parametre pour dir que le truc a remplacer fait pas forcement un caratere, je vais edit mon precedent post, et expliquer comment ca marche
Signez ici
Re: [..] Changer un symbole sur deux
Voici une autre possibilité que je viens de faire, utilisant les expressions régulières, mais j'ignore si elle est très flexible.
En tout cas ça marche pour l'exemple donné :
En tout cas ça marche pour l'exemple donné :
Code : Tout sélectionner
$replace = remplacement_1_sur_2("1;2;3;4;5;6;7;8;9;10", ";", "@")
MsgBox(0, "result", $replace)
Func remplacement_1_sur_2($sString, $sRecherche, $sRemplacement)
If StringRight($sString, "1") <> $sRecherche Then
$sString = $sString & $sRecherche
EndIf
$split = StringRegExp($sString, "(.*?" & $sRecherche & ").*?", 3)
$1_sur_2 = ""
For $i = 1 To UBound($split) - 1 Step 2
$1_sur_2 = $1_sur_2 & $split[$i-1] & StringReplace($split[$i], $sRecherche, $sRemplacement)
Next
Return StringLeft($1_sur_2, StringLen($1_sur_2) - 1)
EndFunc
Modifié en dernier par Tlem le lun. 23 mars 2009 21:27, modifié 1 fois.
Raison : Suppression balise Autoit
Raison : Suppression balise Autoit
- Tlem
- Site Admin

- Messages : 11816
- Enregistré le : ven. 20 juil. 2007 21:00
- Localisation : Bordeaux
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
@Max5 : La coloration syntaxique est réservée aux forums Exemples, Tutoriels et Fonctions et UDF.
Merci.
Merci.
Thierry
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...
Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Bonjour et merci Max5.
Ca a l'air de bien fonctionner aussi.
Ca a l'air de bien fonctionner aussi.
-
eric
- Niveau 5

- Messages : 177
- Enregistré le : sam. 21 mars 2009 17:57
- Localisation : Bretagne
- Status : Hors ligne
Re: [..] Changer un symbole sur deux
Code : Tout sélectionner
if StringCompare(StringMid($string,$i,stringlen($toFind)),$toFind) == 0 then $count+=1Est ce que quelqu'un pourrais l'expliquer plus en détail SVP
Merci.
Re: [..] Changer un symbole sur deux
StringMid a besoin de la chaine ($string), de la position de depart: ici donné par $i pour balayer toute la chaine $string et de combien de caractères il doit avancer: nous ce qui nous intéresse c'est de comparer $toFind donc on cherche quelque chose de la même taille d'ou le stringlen($toFind). Avec le StringMid on arrive donc à découper la chaine, il faut la comparer en utilisant StringCompare et tout sa nous permet d'incrémenter $count afin de savoir combien de fois on a trouvé $toFind.


