[R] Tableau 2D vs Hash

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
benzo
Niveau 4
Niveau 4
Messages : 60
Enregistré le : mar. 07 août 2007 07:45
Status : Hors ligne

[R] Tableau 2D vs Hash

#1

Message par benzo »

Bonjour la communauté,

Je sollicite votre aide pour essayer de constituer une table de hash ou toute autre structure de données existante en autoit qui permettrait d'associer une valeur à une clé.
J'ai un fichier temporaire "Ip_Check.ini' issu d'un resultat de scan (ip =temps de réponse) de la forme suivante:
[IP]
192.168.0.55=203
192.168.0.58=0
192.168.0.63=13
Voici mon code actuel pour récupérer les couples clés/valeur (au passage, il fonctionne très bien)

Code : Tout sélectionner

Global $sTempFile = @TempDir & "\Ip_Check.ini" ; fichier INI temporaire qui stocke les résultats

$aRst=inireadsection( $sTempFile,"IP")

For $i = 1 To $aRst[0][0]
	msgbox(4096,"cles valeurs","adresse IP: " & $aRst[$i][0] & @CRLF & "temps de reponse: " & $aRst[$i][1])
	if ($aRst[$i][1] = 0) Then
		iniwrite($sTempFile,"IP_FAILED",$aRst[$i][0],$aRst[$i][1])
	endif
next
Ok mais plutôt qu'un tableau 2D j'aurais préféré créé une table de hash .
A priori faudrait utiliser "scriptingDictionary" ou chercher du côté de "Map" mais je ne sais pas trop comment m'y prendre.

Si quelqu'un pouvait en reprenant mon script m'expliquer les 2 autres manières de procéder?
Modifié en dernier par benzo le jeu. 21 avr. 2016 14:22, modifié 1 fois.
Oversid3
Niveau 3
Niveau 3
Messages : 45
Enregistré le : jeu. 29 janv. 2015 11:20
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#2

Message par Oversid3 »

Que souhaite tu obtenir comme résultat final ? Sous quel format exactement ?
benzo
Niveau 4
Niveau 4
Messages : 60
Enregistré le : mar. 07 août 2007 07:45
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#3

Message par benzo »

Le résultat ne pose pas de souci mais c'est la manière d'arriver au résultat .
(utiliser une structure de données adequat autre qu'un tableau 2D)

Actuellement, avec le bout de code ci-dessus, je trouve bien les couples clé/valeur dont la valeur est = 0
qui sont stockées dans un tableau 2D, puis je les écris dans le fichier:

[IP_FAILED]
192.168.0.55=0

Je souhaiterais faire la même chose en utilisant un dictionnaire ou une table de hash...
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#4

Message par orax »

J'ai peut-être mal compris mais je ne vois pas comment faire avec une variable de type map ou avec l'objet Scripting.Dictionary.
D'autant plus que IniReadSection retourne un tableau de 2 dimensions donc, pour moi, c'est la seule bonne manière de faire.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#5

Message par mikell »

D'autant plus que comme IniWrite gère aussi l'unicité des clés, utiliser un SD ou une Map ne présente (dans ce cas précis) strictement aucun intérêt
" 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
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#6

Message par jchd »

Si on tient a manipuler une Map, on peut faire ça :

Code : Tout sélectionner

Local $aCheckIP = StringRegExp( _
	"[IP]" & @CRLF & _
	"192.168.0.55=203" & @CRLF & _
	"192.168.0.58=0" & @CRLF & _
	"192.168.0.63=13" & @CRLF, _
	"(?m)([1-9]\d{0,2}(?:\.\d{1,3}){3})\s*=\s*(\d+)", 3)
; IniReadSection ou bien ça :
;~ Local $aCheckIP = StringRegExp(FileRead("Ip_Check.ini"), "(?m)([1-9]\d{0,2}(?:\.\d{1,3}){3})\s*=\s*(\d+)", 3)
;~ _ArrayDisplay($aCheckIP)
Local $mCheckIP[]
For $i = 0 To UBound($aCheckIP) / 2 - 1
	$mCheckIP[$aCheckIP[2 * $i]] = Number($aCheckIP[2 * $i + 1])
Next
; la Map $mCheckIP est chargée
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
benzo
Niveau 4
Niveau 4
Messages : 60
Enregistré le : mar. 07 août 2007 07:45
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#7

Message par benzo »

Merci jchd pour l'exemple d'utilisation d'une variable Maps.
Je possède la version AUtoit 3.3.14.1 et sauf erreur de ma part je ne trouve pas d'explications dans la doc (langage Reference->Variables->Maps?).
Si vous avez des liens je suis preneur...
Peux-tu m'expliquer un peu plus ces 3 lignes ?

Code : Tout sélectionner

Local $mCheckIP[]
For $i = 0 To UBound($aCheckIP) / 2 - 1
   $mCheckIP[$aCheckIP[2 * $i]] = Number($aCheckIP[2 * $i + 1])
Next
; la Map $mCheckIP est chargée
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2284
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#8

Message par jchd »

Le type Map n'est disponible qu'avec la beta. La doc en parle.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [...] Tableau 2D vs Hash

#9

Message par mikell »

Oui bon ya aussi ça

Code : Tout sélectionner

$sTempFile = "Ip_Check.ini"
$sdIP = ObjCreate("Scripting.Dictionary")
$aRst = inireadsection($sTempFile,"IP")
For $i = 1 To $aRst[0][0]
  $sd.add($aRst[$i][0], $aRst[$i][1])
Next
; le dictionnaire est chargé
Passer par une Map ou un SD est faisable évidemment, mais la vraie question reste : quel intérêt ?

Et pour délirer complet on peut aussi faire ça

Code : Tout sélectionner

$sTempFile = "Ip_Check.ini"
$res = StringRegExpReplace(FileRead($sTempFile), '.*=[^0].*\R?', "")
FileWrite($sTempFile, @crlf& StringReplace($res, "[IP]", "[IP_FAILED]"))
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre