Page 1 sur 1
[R] Décomposition fichier pour insertion ListView
Posté : mar. 02 sept. 2014 18:35
par Hugues
Bonjour,
Je souhaite insérer dans une ListView le contenu de mon fichier avec une mise en forme _GUICtrlListView_InsertGroup().
Pour récupérer le nom des section pas de soucis, mais comme mon fichier est composé de la manière suivante:
► Afficher le texte
Code : Tout sélectionner
[Section1];
2; (* No [2] *)
Paris; (* Prefix [8] *)
Lyon; (* IPAdress [15] *)
80; (* Virtual, each [2], separated by ","; MAX: 10 v. c. *)
[Section2];
\\Metropole\txt\; (* Path for txt file on Data Server [254] *)
\\Island\csv\pictures\; (* Move Path for Pictures [254] *)
\\Source\data\toto.ini; (* Path for configuration file toto.ini [254] *)
[Section3];
FALSE; (* Miles (FALSE) or KMS (TRUE): FALSE=No, TRUE=Yes *)
FALSE; (* SafetyMode: FALSE=No, TRUE=Yes *)
;
2; (* Offset *)
Comme vous pouvez le voir, le fichier est presque similaire à un fichier ini, sauf que mon fichier le séparateur est un ";" au lieu de "="...
Mon désir est de mettre dans la colonne de gauche de ma ListView ce qu'il a à gauche de ";" et ce qu'il y a dans la colonne de droite ce qu'il y a à droite de ";"
Mikell m'a déjà fournit ce code mais, comme il utilise les expressions régulières... Je ne sais pas ce qui bloque...
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
$txt = FileRead(@ScriptDir & "\toto.dat")
$txt = StringReplace($txt, "];", "]")
$keys = StringRegExp($txt, '([\S|\h]+);', 3)
Dim $array[UBound($keys)][3] ; nb lignes = nb total de keys
$k = 0
$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)
$array[$k][0] = $section[0] ; nom section
$keys = StringRegExp($contenu_sections[$i], '([\S|\h]+)\s*;', 3)
$values = StringRegExp($contenu_sections[$i], ';\s*([\S|\h]+)', 3)
For $j = 0 to UBound($keys) - 1 ; pour chaque key
$array[$k+$j][1] = $keys[$j] ; nom key
$array[$k+$j][2] = $values[$j] ; nom value
Next
$k += $j
Next
_ArrayDisplay($array)
Merci par avance
Re: [..] Décomposition fichier pour insertion ListView
Posté : mar. 02 sept. 2014 19:07
par orax
Est-ce qu'il y a toujours 2 retours à la ligne entre chaque section (comme dans l'exemple) ?
Code : Tout sélectionner
80; (* Virtual, each [2], separated by ","; MAX: 10 v. c. *)
[Section2]; <== 2 @CRLF avant la section 2
Re: [..] Décomposition fichier pour insertion ListView
Posté : mar. 02 sept. 2014 20:19
par Hugues
Non en fait c'est aléatoire...
Mais c'est 2 mini... Ça dépend de celui qui créer le fichier...

Re: [..] Décomposition fichier pour insertion ListView
Posté : mar. 02 sept. 2014 21:04
par orax
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
#include <debug.au3>
_DebugSetup('', False, 2)
$txt = FileRead(@ScriptDir & "\toto.dat") & @CRLF
$sections = StringRegExp($txt, '(?smx) ^ \[ (.+?) \]; (.+?) (?= (?:\r\n){2,} | \r\n\[ | (?:\r\n)+$)', 3) ; sépare les sections
;~ _ArrayDisplay($contenu_sections)
For $i = 0 To UBound($sections) - 1 Step 2 ; pour chaque section
$nomSection = $sections[$i]
$contenuSection = $sections[$i + 1]
;~ _ArrayDisplay($sections)
_DebugOut('--------------------Section--------------------')
_DebugReportVar('nom section', $nomSection)
_DebugOut($contenuSection)
_DebugOut('------------------Fin section------------------')
$keys = StringRegExp($contenuSection, '(?mx) (.+?); \s* \(\* \s* (.+?) \s* \* \)', 3)
For $j = 0 To UBound($keys) - 1 Step 2 ; pour chaque key
_DebugReportVar('$keys', $keys[$j])
_DebugOut($keys[$j + 1]) ; valeur (la partie à droite)
_DebugOut('')
Next
Next
Ça ne va pas trouver une clé sans valeur. Je ne savais pas si c'était important. J'ai fait quelques essais mais je ne suis pas sûr que ça va marcher correctement.
Re: [..] Décomposition fichier pour insertion ListView
Posté : mar. 02 sept. 2014 21:19
par Hugues
Merci, j'essaie ca demain ^^
Petite question? A quoi correspond l'include debug.au3?
Re: [..] Décomposition fichier pour insertion ListView
Posté : mar. 02 sept. 2014 21:25
par orax
C'est pour les fonctions qui commencent par _Debug. Ça me permet de vérifier les valeurs des variables dans la console de SciTE. Mais ces trucs là pourront être enlevés une fois le script fonctionnel.
Re: [..] Décomposition fichier pour insertion ListView
Posté : mar. 02 sept. 2014 23:16
par jguinch
Un autre bout de code, dans le même genre :
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
Local $sFile = @ScriptDir & "\file.dat"
Local $hFile = FileOpen($sFile)
If $hFile = -1 Then Exit MsgBox(16, "Erreur", "Impossible d'ouvrir le fichier " & $sFile)
Local $sContent = FileRead($hFile)
FileClose($sContent)
Local $aKeys[1][2], $aExtract, $aSection, $sSectionContent
; Récupération des sections
Local $aSections = StringRegExp($sContent, "(?m)^\[([^\]]+)\][;\h]*", 3)
For $i = 0 To UBound($aSections) - 1
; Récupération du contenu de chaque section
$aSection = StringRegExp($sContent, "(?s)(?:\R|\A)\[\Q" & $aSections[$i] & "\E\]\N*\R(.*?)(?:\R\[[^\]]+\]|\Z)", 1)
If @error Then ContinueLoop
; Suppression des lignes vides ou qui contiennent uniquement ";"
$sSectionContent = StringRegExpReplace($aSection[0], "(\R;?){2,}", @CRLF)
; Récupération des clés et valeurs
$aExtract = StringRegExp($sSectionContent, "(?m)^([^;]+);\h*(.*)$", 3)
Redim $aKeys[ UBound($aExtract) / 2][2]
For $j = 0 To UBound($aExtract) - 1 Step 2
$aKeys[$j / 2][0] = $aExtract[$j]
$aKeys[$j / 2][1] = $aExtract[$j + 1]
Next
_ArrayDisplay($aKeys, 'Section "' & $aSections[$i] & '"')
Next
Re: [..] Décomposition fichier pour insertion ListView
Posté : jeu. 04 sept. 2014 11:00
par Hugues
La solution de Jguinch est pile poil celle que je désire!
Je passe le sujet en résolu, merci à toi Orax et Jguinch pour votre aide.
