Page 1 sur 1
[R] Problème de lecture d'un fichier .ini
Posté : lun. 18 mai 2015 15:02
par Bayo
Bonjour,
Je voudrai votre aide pour rechercher dans un fichier .ini.
Les fonctions existantes ne m'aide pas car je dispose d'une partie de la clé et je voudrai la section ou l'autre partie de la clé exemple ci-dessous. J'ai voulu du coup le faire avec un FileReadLine mais ça me lit correctement la 1ere ligne mais toutes les suivantes sont vides.
► Afficher le texte
Modele .ini
[Test200]
Test200_SERIE=70900
donc j'ai le 70900 et faut que je retrouve le Test200.
Merci d'avance.
Re: [..]Pb lecture fichier ini
Posté : lun. 18 mai 2015 15:36
par jchd
Un .INI n'a pas la structure adéquate pour ce genre de recherche. Dans le cas d'un volume non trivial (pas seulement 5 clés) et de recherches multiples, une base SQLite serait parfaite. Avis perso : même pour moins, j'emploie SQLite pour tout stockage applicatif.
Re: [..]Pb lecture fichier ini
Posté : lun. 18 mai 2015 15:55
par Bayo
malheureusement le fichier .ini est utilisé depuis des années dans mon boulot pour stocker des PCs et des informations sur eux et je ne peux pas toucher à ça, donc pour toi il n'est pas possible de faire ce que je veux sur un .ini?
Re: [..]Pb lecture fichier ini
Posté : lun. 18 mai 2015 16:05
par Hugues
Salut,
Tu veux faire une recherche à partir du bout de la clef?
C'est à dire 70900 pour retrouver Test200_SERIE ou bien le nom de ta section [Test200]?
Re: [..]Pb lecture fichier ini
Posté : lun. 18 mai 2015 16:40
par jchd
Je n'ai jamais affirmé que c'était impossible, juste que c'était inadéquat.
Une simple regexp peut fournir le résultat recherché.
Re: [..]Pb lecture fichier ini
Posté : lun. 18 mai 2015 18:25
par mikell
Bien sûr que si, les fonctions ini existantes font l'affaire
► Afficher le texte
Code : Tout sélectionner
Global $ini = "Modele.ini"
$res = _Search("70900")
Msgbox(0,"", "section : " & $res[1] & @crlf & "clé : " & $res[0])
Func _Search($mot)
Local $array[2]
$sections = IniReadSectionNames($ini)
For $i = 1 to $sections[0]
$content = IniReadSection($ini, $sections[$i])
For $k = 1 to $content[0][0]
If StringRegExp($content[$k][1], '^\h*\Q' & $mot & '\E\h*$') Then
$array[0] = $content[$k][0]
$array[1] = $sections[$i]
Exitloop 2
EndIf
Next
Next
Return $array
EndFunc
Ou sinon ça
► Afficher le texte
Code : Tout sélectionner
Global $ini = "Modele.ini"
Msgbox(0,"", "clé : " & _Search("70900"))
Func _Search($mot)
Return StringRegExp(FileRead($ini), '(?m)^(\V+)=\h*\Q' & $mot & '\E\h*$', 3)[0]
EndFunc
Re: [..]Pb lecture fichier ini
Posté : lun. 18 mai 2015 21:26
par Bayo
merci je testerai tout ça au boulot demain, en effet ta solution est cohérente par contre j'ai toujours eu du mal avec les StringRegExp($content[$k][1], '\h*\Q' & $mot & '\E\h*') que j'ai vraiment du mal à comprendre (\h*\Q etc) quand je recherche quelque chose, je fais des StringSplit de tout les côtés.
Merci je te tiens au courant demain
Re: [..]Pb lecture fichier ini
Posté : lun. 18 mai 2015 22:49
par jchd
Autant rechercher directement une section suivie d'une clé ayant pour valeur ce qui est recherché, soit au total une seule regexp, AMHA. Sauf à devoir valider après coup un seul résultat dans plusieurs sections où il figure.
Ceci dit, je maintiens qu'un .INI n'est pas le conteneur adapté à ce qu'on cherche à faire. Ce n'est pas parce "qu'on a toujours fait comme ça" qu'on doit persister dans l'erreur, toujours AMHA.
Re: [..] Problème de lecture d'un fichier .ini
Posté : mar. 19 mai 2015 13:51
par Tlem
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. ^^
Re: [..] Problème de lecture d'un fichier .ini
Posté : mar. 19 mai 2015 14:59
par Bayo
Merci, je viens de tester les 2 solutions la première met 96secondes à trouver dans le fichier .ini contre 0,1secondes pour la seconde solution, mon choix est fait.
Merci encore, c'est parfait