Page 1 sur 1
[R] Tri doublons
Posté : ven. 14 nov. 2014 09:12
par Hugues
Bonjour,
Je lis une fichier *.ini Section par Section afin de récupérer toutes les Clefs et les valeurs contenues. J'écris le resultat dans un fichier txt, puis je le relis pour supprimer les doublons.
J'aimerai savoir comment fait-on sans passer par un fichier txt?
Merci par avance. Ci joint mes codes:
Fichier ini:
► Afficher le texte
Code : Tout sélectionner
[Section_1]
=
[Section_2]
Clef_1=AZERTY
Clef_2=UIOP
Clef_3=OUPS
[Section_3]
CLEF_2=Wesh Poto
[Section_4]
=
[Section_5]
CLEF_1=Bof
[Section_6]
Clef_2=YOUHOU
[Section_7]
CLEF_3=YOLO
clef_4=
Mon programme:
► Afficher le texte
Code : Tout sélectionner
#include <array.au3>
$IniTypeOfProcess = @ScriptDir & "\ini\example.ini"
$File = @ScriptDir & "\temp\TriDoublons.txt"
_FillComboBoxSearchByTool()
Global $aArray2
Func _FillComboBoxSearchByTool()
SplashTextOn("", "Chargement des données" & @CRLF & "Veuillez patienter svp.", 450, 55, -1, @DesktopHeight / 2, 49)
Global $aArray = IniReadSectionNames($IniTypeOfProcess)
If Not @error Then
For $i = 1 To $aArray[0]
$SectionName = $aArray[$i]
_IniReadSection($SectionName)
$SectionName = ""
Next
EndIf
$DelDoublonsHelp = FileReadToArray($File)
$DeletedDoublons = _ArrayUnique($DelDoublonsHelp)
For $l=1 To UBound($DeletedDoublons)-1
ConsoleWrite($DeletedDoublons[$l] & @CRLF)
Next
SplashOff()
EndFunc
Func _IniReadSection($SectionName)
$aArray2 = IniReadSection($IniTypeOfProcess, $SectionName)
Dim $aArrayTemp[$aArray2[0][0]]
If Not @error Then
For $i = 1 To $aArray2[0][0]
If $aArray2[$i][0] = "" Then
Else
FileWrite($File, $aArray2[$i][0] & @CRLF)
EndIf
Next
EndIf
EndFunc
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 09:43
par TomAijerrie
En passant par une array ?
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 09:55
par jbnh
tu passes par une array suivi de _arrayunique et hop !
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 10:03
par jguinch
Il y a quelque chose que je ne comprends pas : est-ce que tu vas supprimer toutes les entrées en double ou juste en laisser une (et donc laquelle ?) ?
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 10:16
par Hugues
Dans mon fichier ini, je peux retrouver une clef (avec des valeurs differentes) dans chaque section. Si par exemple je lis toute mes sections et que je trouve Clef_1 4 fois, je veux qu'il me retourne qu'1 fois Clef_1 et ça autant de fois que de clef trouvées... Donc supprimer toutes les entrées en double.
Car après j'alimente une ComboBox en fonction de ce tri.
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 10:28
par jguinch
Si tu veux récupérer uniquement les clés sans te soucier des sections et au passage supprimer les doublons, tu peux faire un truc de ce genre :
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
; $sContent = FileRead("fichier.ini")
$sContent = "[Section_1]" & @CRLF & _
"=" & @CRLF & _
"[Section_2]" & @CRLF & _
"Clef_1=AZERTY" & @CRLF & _
"Clef_2=UIOP" & @CRLF & _
"Clef_3=OUPS" & @CRLF & _
"[Section_3]" & @CRLF & _
"CLEF_2=Wesh Poto" & @CRLF & _
"[Section_4]" & @CRLF & _
"=" & @CRLF & _
"[Section_5]" & @CRLF & _
"CLEF_1=Bof" & @CRLF & _
"[Section_6]" & @CRLF & _
"Clef_2=YOUHOU" & @CRLF & _
"[Section_7]" & @CRLF & _
"CLEF_3=YOLO" & @CRLF & _
"clef_4="
; $aKeys = StringRegExp($sContent, "(?si)\R([^=\r\n]+)=", 3) ; Toutes les clés, sans suppression des doublons
$aKeysUniq = StringRegExp($sContent, "(?si)\R([^=\r\n]+)=(?!.*\R\1=)", 3) ; Toutes les clés, sans doublons
_ArrayDisplay($aKeysUniq)
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 10:43
par Hugues
Oui ça c'est impec, mais comment je stock toutes mes clefs dans un array sans me soucier des sections (je pense que c'est ça mon problème de base...

)?
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 11:15
par Hugues
Mille excuses, c'est bon j'ai trouvé!
Voici la solution (code de Mikell) pour ceux que ca interesse...
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
$ini = @ScriptDir & "\Monfichier.ini"
_DeleteDoublons($ini)
Func _DeleteDoublons($ini_file)
Local $txt = FileRead($ini_file), $section, $keys, $values, $array[1][3], $k = 0
Local $contenu_sections = StringRegExp($txt, '(\[[^\[]+)', 3) ; sépare les sections
For $i = 0 to UBound($contenu_sections) - 1 ; pour chaque section
$section = StringRegExp($contenu_sections[$i], '\[([^\]]+)', 3)
$keys = StringRegExp($contenu_sections[$i], '([\S\h]*)=', 3)
$values = StringRegExp($contenu_sections[$i], '=([\S\h]*)', 3)
If IsArray($keys) Then
Redim $array[$k+UBound($keys)][3]
$array[$k][0] = $section[0] ; nom de la section
For $j = 0 to UBound($keys) - 1 ; pour chaque key
If not StringRegExp($keys[$j], '^\s*;' ) Then ; lignes non commentées
;~ $array[$k][0] = $section[0] ; nom section
$array[$k][1] = $keys[$j] ; nom key
$array[$k][2] = StringRegExpReplace($values[$j], '\s*;.*$', "") ; nom value
$k += 1
EndIf
Next
Else ; si section vide
Redim $array[$k+1][3]
$array[$k][0] = $section[0] ; nom section seulement
$k += 1
EndIf
Next
$DeletedDoublons = _ArrayUnique($array,1)
For $l=2 To UBound($DeletedDoublons)-1
ConsoleWrite($DeletedDoublons[$l] & @CRLF)
Next
;_ArrayDisplay($DeletedDoublons)
EndFunc
Merci à tous pour votre aide!!
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 14:51
par jguinch
Ton problème est-il [R]ésolu ?
Re: [..]Tri doublons
Posté : ven. 14 nov. 2014 21:51
par Hugues
Heu oui, j'ai oublié de mettre la balise...
