Bonsoir.
D'après les informations données par Bayo, il n'est pas question voir impossible de modifier le programme qui produit ces fichiers .ini. Donc exit la possibilité d'utiliser autre chose que l'existant. ^^
Ensuite d'après ce que je comprend, Bayo souhaite avoir :
- Soit le nom de la section
- Soit le début de la clé correspondant à "la valeur connue" (qui est identique au nom de la section).
Les codes de mikell sont pas mal, mais peuvent entrainer quelques erreurs.
Le premier code vérifie si la valeur recherchée existe dans la valeur de la clé. Ce qui poserait un problème pour un .ini contenant ce type de valeurs :
Le deuxième code de mikell, bien qu'attrayant par le peu de code, présente aussi un gros problème.
Si la valeur de clé n'existe pas, alors erreur (Subscript used on non-accessible variable).
En partant du principe que la/les clé(s) d'une section est/sont composée(s) du nom de la section suivit du caractère "_" puis d'un élément complémentaire, vous trouverez ci-dessous les codes de mikell adapté.
► Afficher le texte
Code : Tout sélectionner
Global $ini = "Modele.ini"
Global $Var2Find = "70900"
$Res = _Search($Var2Find)
If @error Then
MsgBox(16, "", "Valeur non trouvée")
Else
MsgBox(0, "", "Valeur recherchée : " & $res)
EndIf
Func _Search($sVar)
$aSections = IniReadSectionNames($ini)
If @error Then Return SetError(1, 0, 0)
For $i = 1 To $aSections[0]
$aKeys = IniReadSection($ini, $aSections[$i])
If @error Then Return SetError(1, 0, 0)
For $k = 1 To $aKeys[0][0]
If $aKeys[$k][1] = $sVar Then Return $aSections[$i]
Next
Next
Return SetError(1, 0, 0)
EndFunc ;==>_Search
et
► Afficher le texte
Code : Tout sélectionner
Global $ini = "Modele.ini"
Global $Var2Find = "70900"
$Res = _Search($Var2Find)
If @error Then
MsgBox(16, "", "Valeur non trouvée")
Else
MsgBox(0, "", "Valeur recherchée : " & $res)
EndIf
Func _Search($sVar)
Local $aRet = StringRegExp(FileRead($ini), '(?m)^(\V+)=\h*\Q' & $sVar & '\E\h*$', 3)
If @error Then Return SetError(1, 0, 0)
Local $aVar = StringSplit($aRet[0], "_")
If IsArray($aVar) Then Return $aVar[1]
Return SetError(1, 0, 0)
EndFunc ;==>_Search
L'écart du nombre de lignes de code est peu moins significatif. ^^