Page 1 sur 1

[R] Evaluer dynamiquement un string

Posté : jeu. 03 oct. 2013 02:43
par Sachadee
Hello,

Une question qui me trotte dans la tête depuis hier c'est juste une question technique, pas un problème !

Peut-on dynamiquement évaluer un string en Autoit ?
Je m'explique !

J'ai par exemple le string

Code : Tout sélectionner

"$Ville = Paris"
Est-il est possible d'évaluer ce string de manière à pouvoir ensuite utiliser la variable [ $Ville ].

Par exemple :

Code : Tout sélectionner

MsgBox("", "Ville", $ville)
C'est juste pour savoir si l'on peut faire des fichiers de sauvegarde en définissant directement les variables dans le fichier, type :

Sauve.txt :

Code : Tout sélectionner

$client = Dupond
$adresse = Chemin des bois
$Ville = Paris
Et ensuite les évaluer dynamiquement comme on pourrait le faire en batch avec un [ Set ]

Code : Tout sélectionner

for /f "delims=" %%a in (sauve.txt) do (set %%a)
set $
J'ai utilisé cette solution qui répond parfaitement à mes attentes :

Code : Tout sélectionner

$SaveClient = "Dupond / Chemin des Bois, 25 / Paris"
$SaveArr = StringSplit($SaveClient, "/")
$Client = $SaveArr[1]
$Adresse = $SaveArr[2]
$Ville = $SaveArr[3]
MsgBox("","","Client : " & $Client & @Cr & "Adresse : " & $Adresse & @Cr & "Ville : " & $Ville
Mais ma question subsiste.

:wink:

Re: [..] Evaluer dynamiquement un string

Posté : jeu. 03 oct. 2013 08:36
par Tlem
Grosso modo, voici le traitement pour une chaine.
A mettre dans une boucle de lecture du fichier pour traiter toutes les lignes.

Cet exercice est quand même plus ou moins limité si vous n'avez ne connaissez pas le nom des variables en amont, car le traitement des valeurs restera dans l'assignation des variables. Mais sans doute est-ce pour simplifier la procédure de mise en variable de quelque chose qui est déjà connu. ;)

Code : Tout sélectionner

$a = "$adresse = Chemin des bois"

$aVar = StringSplit($a, "=") ; On coupe la chaine en deux au signe égal.

For $i = 1 To UBound($aVar) - 1
    $aVar[$i] = StringStripWS($aVar[$i], 3) ; On supprime les espaces éventuels avant et après chaque élément.
Next

Assign (StringTrimLeft($aVar[1], 1), $aVar[2], 2) ; On enlève le $ de la variable (Assigne le fait implicitement) puis on assigne la variable.

MsgBox(0, "La variable",  $aVar[1] & " = " & Eval(StringTrimLeft($aVar[1], 1)))
Peut être que notre ami Michel convertira les premières lignes de code en traitement par expression régulière pour remplacer le StringSplit et la boucle For/Next par une seule ligne de traitement. :mrgreen:

Re: [..] Evaluer dynamiquement un string

Posté : jeu. 03 oct. 2013 09:14
par jguinch
Bonjour.
Comme je me met aux expressions régulières, je réponds en ce sens :

Code : Tout sélectionner

$a = "$adresse = Chemin des bois"
$aVar = StringRegExp($a, "\$(\w+)\h*=\h*(.+)", 3)
Assign($aVar[0], $aVar[1])

MsgBox(0, "La variable", "$adresse = " & $adresse)

Re: [..] Evaluer dynamiquement un string

Posté : jeu. 03 oct. 2013 16:39
par mikell
Mettre le $ dans la string de départ est un non-sens avec Assign

Code : Tout sélectionner

$a = "adresse = Chemin des bois"
$aVar = StringRegExp($a, "(\w+)\h*=\h*(.+)", 3)
Assign($aVar[0], $aVar[1])
MsgBox(0, "", "$adresse = " & $adresse)
Faire des "évaluations de strings" à coups de Assign risque de donner à la sortie un script acrobatique
La vraie question devrait être sur la manière optimale de stocker et gérer les infos client

Code : Tout sélectionner

$client = Dupond
$adresse = Chemin des bois
$Ville = Paris
ça évoque une section de ini, on peut aussi songer à une bdd si le nombre de clients doit être conséquent et si on veut s'accorder de la souplesse dans la gestion de chaque "rubrique client" (tri, ajout éventuel d'infos etc)

Re: [..] Evaluer dynamiquement un string

Posté : jeu. 03 oct. 2013 19:54
par Sachadee
Merci pour vos réponse,

Cela répond exactement à ma question !
mikell a écrit : La vraie question devrait être sur la manière optimale de stocker et gérer les infos client

ça évoque une section de ini, on peut aussi songer à une bdd si le nombre de clients doit être conséquent et si on veut s'accorder de la souplesse dans la gestion de chaque "rubrique client" (tri, ajout éventuel d'infos etc)
Effectivement ceçi était juste un exemple pour voir si il existait cette possibilité.
Cela peut être intèressant pour le chargement de donnée sauvegardée (édition et modification de formulaire par exemple) tout en restant
très flexible dans l'ajout de nouveau élément (champs) ultérieurement, vu qu'avec cette méthode on n'est pas dépendant de la position de la valeur dans une liste ou une Array, ou d'un Label et une clé (dans le cas d'un ini) , mais uniquement du nom de la variable.
Ce qui peut simplifier les choses dans bien des cas.

Voici la fonction _EvalSaveFile en utilisant la méthode à Tlem :

Code : Tout sélectionner

_EvalSaveFile("sauve.txt")
MsgBox("", "",$Client & @cr & $adresse & @cr& $ville)

func _EvalSaveFile ($Savefile)
   Local $file = FileOpen($saveFile, 0)
While 1
    Local $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $aVar = StringSplit($line, "=")
    For $i = 1 To UBound($aVar) - 1
    $aVar[$i] = StringStripWS($aVar[$i], 3)
 Next
 Assign (StringTrimLeft($aVar[1], 1), $aVar[2], 2)
WEnd
FileClose($SaveFile)
EndFunc
et le sauve.txt :

Code : Tout sélectionner

$client = toto
$Adresse = chemin des bois
$Ville = Paris

En tout cas merci à vous pour vos réponses.

A+ :D

Re: [..] Evaluer dynamiquement un string

Posté : jeu. 03 oct. 2013 22:01
par lesolutionneur
Pensez à passer le message en résolu --> [R] dans le titre