Page 1 sur 1
[R] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 19:21
par Krakotte
Bonjour à tous,
Dans le cadre d'un projet étudiant j'ai plusieurs centaines de mesures à effectuer sur un logiciel. J'ai décidé d'automatiser ses mesures avec une maccro AutoIt basique.
Le logiciel me sort une valeur que je copie et insert dans une variables pour je puisse la traiter ensuite. Le seul problème est qu'il me sort des variables de deux styles :
"Force : 200.000" ou "Force : 1,600M" (c'est des Newtons).
De là, j'aimerai obtenir 200 000 et 1 600 000 pour pouvoir effectuer mes calculs.
Il faut donc que je supprime le ".", la ",", "Force :" et remplace M par "000".
Je pense qu'une fonction String[...] peut m'aider, mais je ne maitrise pas du tout ce genre de fonction...
Si vous pouviez m'aider à faire le tri dans ma variable ce serait super !
Voici la tête du code :
Code : Tout sélectionner
; mise en route du test
MouseClickDrag("", 971, 658, 991, 675, 0) ; récupération de la force trouvé
Send("^c")
$Force = ClipGet()
[...]
......... ; conversion de la variable en un chiffre simple
[...]
; calculs et sortie de résultat
Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 20:03
par jguinch
Est-ce que ça te convient ?
► Afficher le texte
Code : Tout sélectionner
$string1 = "Force : 200.000"
$out1 = _ExtractNum($string1)
ConsoleWrite($out1 & @CRLF)
$string2 = "Force : 1,600M"
$out2 = _ExtractNum($string2)
ConsoleWrite($out2 & @CRLF)
Func _ExtractNum($sText)
Local $out = StringRegExpReplace($sText, "^\D+|[.,]", "")
$out = StringReplace($out, "M", "")
If @extended Then $out &= "000"
Return $out
EndFunc
Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 20:34
par mikell
$string2 = "Force : 1M"

► Afficher le texte
Code : Tout sélectionner
$string1 = "Force : 200.000"
$out1 = _ExtractNum($string1)
Msgbox(0, "", $out1)
$string2 = "Force : 1,600M"
$out2 = _ExtractNum($string2)
Msgbox(0, "", $out2)
$string3 = "Force : 1M"
$out3 = _ExtractNum($string3)
Msgbox(0, "", $out3)
Func _ExtractNum($sText)
Local $out = StringRegExpReplace($sText, "[^\d.,M]", "")
If StringInStr($out, "M") Then
$out = StringReplace($out, ",", ".")*10^6
Else
$out = StringReplace($out, ".", "")
EndIf
Return $out
EndFunc
Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 21:06
par jguinch
ah ouais, la je suis pas bon...

Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 21:33
par Krakotte
Merci beaucoup à vous ! J'ai fais plusieurs test de tout les cas possible et la valeur retourné est toujours correct

Merci vous m'enlevez une belle épine du pied !
A présent j'aimerai comprendre (histoire de me coucher moins bête) :
► Afficher le texte
Ceci remplace certain caractère dans "$sText" par du "vide", je comprend pour le point, la virgule et le M, mais pourquoi "^\d" ou "^\D+|" dans l'autre ?
Code : Tout sélectionner
If StringInStr($out, "M") Then
$out = StringReplace($out, ",", ".")*10^6
Else
$out = StringReplace($out, ".", "")
EndIf
Là je ne comprend pas pourquoi on recherche le M après l'avoir remplacé par du "vide" juste avant...
Et enfin ce que fait le "Return $out" à la fin ?
Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 22:54
par mikell
Voilou, with comments
Code : Tout sélectionner
Func _ExtractNum($sText)
[color=#00BF00]; remplace tout ce qui n'est [u]PAS[/u] (un chiffre/un point/une virgule/la lettre M) par rien[/color]
[color=#00BF00] ; c'est le "^" qui marque cette négation, \d = un chiffre[/color]
Local $out = StringRegExpReplace($sText, "[^\d.,M]", "")
[color=#00BF00]; dans le résultat, s'il y a la lettre M :[/color]
If StringInStr($out, "M") Then
[color=#00BF00]; remplace la virgule (si elle existe) par un point (on obtient alors un décimal en notation EN)
; et multiplie ça par 10 puissance 6[/color]
$out = StringReplace($out, ",", ".")*10^6
Else
[color=#00BF00]; sinon supprime le point (s'il existe)[/color]
$out = StringReplace($out, ".", "")
EndIf
[color=#00BF00]; et la fonction retourne le résultat final[/color]
Return $out
EndFunc
Note qu'il y a une finesse qui exploite une particularité du fonctionnement interne d'AutoIt en matière de calcul, exemple :
Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 23:27
par jguinch
Je reprends quand même mon code, histoire de finir ce que j'ai commencé :
► Afficher le texte
Code : Tout sélectionner
Func _ExtractNum($sText)
Local $out = StringRegExpReplace($sText, "^\D+|\.", "")
$out = StringReplace(StringReplace($out, ",", "."), "M", "")
If @extended Then $out *= 10^6
Return Number($out)
EndFunc
@Mikell :
1,234 te retourne
1,234 , donc ça risque de poser problème pour un futur calcul

Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 23:33
par Krakotte
Super ! Merci pour les commentaires je comprend bien mieux
Apparement Autoit se fiche d'avoir un M qui traine dans sa variable avant de la multiplier... C'est bon à savoir !
En tout cas merci à vous deux pour votre aide, bonne soirée !
Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 23:44
par jguinch
Oui, car une opération sur une chaîne va convertir la chaîne en nombre avant de procéder à l'opération.
La page d'aide de la fonction Number te donnera l'explication sur ce sujet (voir la partie Remarks)
Re: [..] Extraire les chiffres d'une variable
Posté : dim. 18 oct. 2015 23:56
par jguinch
@Krakotte : merci de passer le sujet en [R] si le problème est résolu.
Re: [..] Extraire les chiffres d'une variable
Posté : lun. 19 oct. 2015 01:05
par mikell
jguinch a écrit :@Mikell :
1,234 te retourne
1,234 , donc ça risque de poser problème pour un futur calcul

Ah, on fait le malin maintenant
Oui, j'avais un tout petit peu (quand même) noté ça mais vu l'échelle des valeurs mentionnées, le risque d'avoir 1,234 Newtons m'a semblé peu probable
