Page 1 sur 1

[R] Tableau 2D vs Hash

Posté : mer. 20 avr. 2016 11:28
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?

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

Posté : mer. 20 avr. 2016 12:35
par Oversid3
Que souhaite tu obtenir comme résultat final ? Sous quel format exactement ?

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

Posté : mer. 20 avr. 2016 13:03
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...

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

Posté : mer. 20 avr. 2016 15:31
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.

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

Posté : mer. 20 avr. 2016 18:24
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

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

Posté : jeu. 21 avr. 2016 02:15
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

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

Posté : jeu. 21 avr. 2016 08:35
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

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

Posté : jeu. 21 avr. 2016 10:23
par jchd
Le type Map n'est disponible qu'avec la beta. La doc en parle.

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

Posté : jeu. 21 avr. 2016 10:56
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]"))