[R] Evaluer dynamiquement un string

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Sachadee
Niveau 2
Niveau 2
Messages : 23
Enregistré le : dim. 29 sept. 2013 03:50
Status : Hors ligne

[R] Evaluer dynamiquement un string

#1

Message 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:
Modifié en dernier par Sachadee le ven. 04 oct. 2013 01:10, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Evaluer dynamiquement un string

#2

Message 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:
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é".
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Evaluer dynamiquement un string

#3

Message 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)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Evaluer dynamiquement un string

#4

Message 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)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Sachadee
Niveau 2
Niveau 2
Messages : 23
Enregistré le : dim. 29 sept. 2013 03:50
Status : Hors ligne

Re: [..] Evaluer dynamiquement un string

#5

Message 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
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..] Evaluer dynamiquement un string

#6

Message par lesolutionneur »

Pensez à passer le message en résolu --> [R] dans le titre
Répondre