- Fichier Csv - Lire un tableau 2D GuiCtrlData - Remplire liste déroulante- résolu

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
BastienDvpSta
Niveau 1
Niveau 1
Messages : 8
Enregistré le : jeu. 02 juin 2016 09:08
Status : Hors ligne

- Fichier Csv - Lire un tableau 2D GuiCtrlData - Remplire liste déroulante- résolu

#1

Message par BastienDvpSta »

Afin de remplire une liste déroulante j'ai crée un code qui lis le fichier csv et l'implimente dans une liste déroulante .
Cependant le compteur est en dur dans mon fichier csv si un utilisateur rajoute des lignes dans le fichier csv il devra modifier le compteur cela entrainera des risques d'erreur .
Solution demander : Je voudrais que dans ma boucle for de i jusqu a x le nombre x qui correspond au nombre de ligne a lire du fichier csv s'adapte automatiquement

Je n'arrive pas a joindre mon dossier mais il est tres simple

Code : Tout sélectionner

Colonne 0                | Colonne 1                                          | Colonne 2
-----------------------------------------------------------------------------------------
Ligne 0 Architecture SE  | AjouterCompteurNb Ligne - 1 ( aide a la personne ) |
Ligne 1  32 bit          | 2 ( le compteur a saisir                           |
Ligne 2  64 bit          |

Ci dessous : Mon Application , Une fonction pour lire le csv

#include <ButtonConstants.au3>
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIComboBox.au3>
#include <Array.au3>
_Lecture_Fichier_Csv_Et_Mise_En_Place_Dans_ComboBox()

func _Lecture_Fichier_Csv_Et_Mise_En_Place_Dans_ComboBox()

; Recupere CSV dans un tableau
Global $csvArchitectureSE = _CSV2Array("C:\ArchitectureSE.csv", ",")

; Nom par defaut combox box ligne 0 colonne0 du csv
Global $nameComboBoxArchitecture =  $csvArchitectureSE[0][0]

; Compteur Csv
Global $cptArchitectureSE = $csvArchitectureSE[1][1]

; Création Graphique
Global $projet = GUICreate("Form1", 615, 792, 431, 138)
Global $group1 = GUICtrlCreateGroup("", 80, 0, 425, 737)

; Création Combo
Global $architecture = GUICtrlCreateCombo($nameComboBoxArchitecture, 208, 536, 153, 25, BitOR($CBS_DROPDOWN, $CBS_AUTOHSCROLL))

; Boucle qui lis le dossier CSV architecture SE et le mes dans la liste déroulante
For $i = 1 To $cptArchitectureSE
   GUICtrlSetData(-1, $csvArchitectureSE[$i][0])
Next

EndFunc



 #FUNCTION# ===================================================================
; Name ..........: _CSV2Array
; Description ...:
; AutoIt Version : V3.3.0.0
; Syntax ........: _CSV2Array($hFile[, $cSeperator = "auto"[, $bFilterString = True[, $iColumnMode = 0]]])
; Parameter(s): .: $hFile       - Handle for the CSV file to Read
;                  $cSeperator  - Optional: (Default = "auto") : Tries to find the separator char (; or , or TAB or | or space)
;                               | Data-seperator-char
;                               | Empty-string = Opt("GUIDataSeparatorChar")
;                  $bFilterString - Optional: (Default = True) : Removes leading and trailing " or '
;                  $iColumnMode - Optional: (Default = 0) :
;                               | 0: Sets error if lines have different columns and @extended to the csv-line number
;                               | 1: returns lines with different columns numbers comparing to the first line, too
;                               | 2: removing all columns > column numbers in the first line
; Return Value ..: Success      - 2-dim Array
;                  Failure      - 0
;                  @ERROR       - 1: error file read
;                  @ERROR       - 2: different number of columns / @EXTENDED = CSV-line
;                               - 3: parameter error
; Author(s) .....: Thorsten Willert
; Date ..........: Mon Dec 07 18:59:46 CET 2009
; ==============================================================================
Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True, $iColumnMode = 0)
    Local $s = FileRead($hFile)
    If @error Then Return SetError(1)

    If $cSeperator = Default Then $cSeperator = "auto"
    If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar")

    ; searching the line-seperator and splitting the lines into an array
    Local $aLines
    If StringInStr($s, @CRLF) Then
        $aLines = StringSplit($s, @CRLF, 1)
    ElseIf StringInStr($s, @CR) Then
        $aLines = StringSplit($s, @CR)
    Else
        $aLines = StringSplit($s, @LF)
    EndIf

    ; searching the delimiter in the first line
    Local $aTMP
    If $cSeperator = "auto" Then
        Local $iMax = 0
        Local $iC[5] = [0, 0, 0, 0, 0]
        Local $sC[5] = [";", ",", @TAB, "|", " "]

        $aTMP = StringRegExp($aLines[1], ";", 3)
        If Not @error Then $iC[0] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], ",", 3)
        If Not @error Then $iC[1] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "\t", 3)
        If Not @error Then $iC[2] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "\|", 3)
        If Not @error Then $iC[3] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "[ ]", 3)
        If Not @error Then $iC[4] = UBound($aTMP)

        For $i = 0 To UBound($sC) - 1
            If $iC[$i] > $iMax Then
                $iMax = $iC[$i]
                $cSeperator = $sC[$i]
            EndIf
        Next
    EndIf

    ; creating 2-dim array based on the number of data in the first line
    $aTMP = StringSplit($aLines[1], $cSeperator)
    Local $iCol = $aTMP[0]
    Local $aRet[$aLines[0]][$iCol]

    ; splitting and filling the lines
    For $i = 1 To $aLines[0]
        $aTMP = StringSplit($aLines[$i], $cSeperator)
        If @error Then ContinueLoop
        If $aTMP[0] > $iCol Then
            Switch $iColumnMode
                Case 0
                    Return SetError(2, $i)
                Case 1
                    ReDim $aRet[$aLines[0] - 1][$aTMP[0]]
                Case 2
                    $aTMP[0] = $iCol
                Case Else
                    Return SetError(3)
            EndSwitch
        EndIf
        For $j = 1 To $aTMP[0]
            $aTMP[$j] = StringStripWS($aTMP[$j], 3)

            ; removing leading and trailing " or '
            If $bFilterString Then $aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')

            $aRet[$i - 1][$j - 1] = $aTMP[$j]
        Next ; /cols
    Next ; /lines

    Return $aRet
EndFunc   ;==>_CSV2Array
Merci de vos futur réponse
Modifié en dernier par BastienDvpSta le mar. 14 juin 2016 11:35, modifié 2 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: - Fichier Csv - Compteur - Non résolu

#2

Message par orax »

Il faut utiliser Ubound dans ce cas.
For $i = 1 To UBound($csvArchitectureSE) - 1
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
BastienDvpSta
Niveau 1
Niveau 1
Messages : 8
Enregistré le : jeu. 02 juin 2016 09:08
Status : Hors ligne

Re: - Fichier Csv - Compteur - Non résolu

#3

Message par BastienDvpSta »

J'ai essayer mais j’obtiens uniquement du blanc dans ma liste déroulante serais-t-il possible d'avoir une exemple ? merci d'avance
Hugues
Niveau 8
Niveau 8
Messages : 597
Enregistré le : ven. 21 sept. 2012 18:12
Status : Hors ligne

Re: - Fichier Csv - Compteur - Non résolu

#4

Message par Hugues »

Salut,

Etant que c'est un fichier CSV, le séparateur doit être ";" , essaie de remplacer:

Code : Tout sélectionner

Global $csvArchitectureSE = _CSV2Array("C:\ArchitectureSE.csv", ",")
par

Code : Tout sélectionner

Global $csvArchitectureSE = _CSV2Array("C:\ArchitectureSE.csv", ";")
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: - Fichier Csv - Compteur - Non résolu

#5

Message par mikell »

Poster le csv permettrait une réponse précise ...
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: - Fichier Csv - Compteur - Non résolu

#6

Message par orax »

Il y a la fonction _FileReadToArray qui ressemble à ce que tu cherches à faire.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
BastienDvpSta
Niveau 1
Niveau 1
Messages : 8
Enregistré le : jeu. 02 juin 2016 09:08
Status : Hors ligne

Re: - Fichier Csv - Compteur - Non résolu

#7

Message par BastienDvpSta »

Voila mon jeu de test

Code : Tout sélectionner

Global $architecture = GUICtrlCreateCombo($nameComboBoxArchitecture, 208, 536, 153, 25)
; Now add data
For $i =  0 To  UBound($csvArchitectureSE) - 1
	GUICtrlSetData(-1, $csvArchitectureSE[$i][0])
	MsgBox($MB_SYSTEMMODAL, "Title", 	GUICtrlSetData(-1, $csvArchitectureSE[$i][0]&"|"))
Next
; Now set the edit text - this way it is not one of the possible selections
_GUICtrlComboBox_SetEditText($architecture, $nameComboBoxArchitecture)
; And now limit the number of items to show to 15
GUICtrlSendMsg($architecture, $CB_SETMINVISIBLE, 15, 0)
Cas 1 :
Je veux lire les données suivante qui sont dans la colonne 0
- Architecture SE
- 32 Bit
- 64 Bit

La fonction me renvoi un succes par l'intermediaire d'un 1
- 1
-1
- 1
- 1
cependant la liste déroulante est vide au final

Code : Tout sélectionner

Global $architecture = GUICtrlCreateCombo($nameComboBoxArchitecture, 208, 536, 153, 25)
; Now add data
For $i = 0 To  UBound($csvArchitectureSE) - 1
	GUICtrlSetData(-1, $csvArchitectureSE[$i][0])
	MsgBox($MB_SYSTEMMODAL, "Title", $csvArchitectureSE[$i][0])
Next
; Now set the edit text - this way it is not one of the possible selections
_GUICtrlComboBox_SetEditText($architecture, $nameComboBoxArchitecture)
; And now limit the number of items to show to 15
GUICtrlSendMsg($architecture, $CB_SETMINVISIBLE, 15, 0)
Si je mes uniquement une Message Box Alors la boucle est parcouru trois fois
- Architecture SE
- 32 Bit
- 64 Bit
- un blanc

cependant la liste déroulante affiche du blanc au final

Je voudrais que ce qu'arrive a afficher la message Box soit dans la liste déroulante
Je n'arrive pas a mettre de fichier csv mais faites avec 1 2 et 3 ou n'importe quel autres caractères seul la méthode m’intéresse

Exemple avec un tableau 1D ca marche très bien mais pas 2D :(

Code : Tout sélectionner

#include <file.au3>
$array=_FileListToArray(@ScriptDir)

$hwnd=GUICreate("test",400,200)
$combo=GUICtrlCreateCombo("Select an item",10,10)
For $i=1 To Ubound($array)-1
    GUICtrlSetData($combo,$array[$i])
Next

GUISetState()

Do
    $msg=GUIGetMsg()
Until $msg=-3
BastienDvpSta
Niveau 1
Niveau 1
Messages : 8
Enregistré le : jeu. 02 juin 2016 09:08
Status : Hors ligne

Re: - Fichier Csv - Lire un tableau 2D GuiCtrlData - Remplire liste déroulante- résolu  

#8

Message par BastienDvpSta »

Voila la solution pour les futurs personne qui auront le même problème que moi :

Dabord un exemple simple pour comprendre comment fonctionne le programme :

Code : Tout sélectionner

#include <file.au3>
Dim $array[5][2]=[["PRENOM", "ARGENT"], ["Jim", 485.44], ["Louis", 160.68], ["Paul", 275.16], ["Richard", 320.00]]

$hwnd=GUICreate("test",400,200)
$combo=GUICtrlCreateCombo("Select an item",10,10)
For $i=1 To Ubound($array)-1
    GUICtrlSetData($combo,$array[$i][0])
Next



GUISetState()

Do
    $msg=GUIGetMsg()
Until $msg=-3

En second mon programme
Explication : Cela Correspond au programme d"au dessus cependant on efface toutes les lignes blanche du csv ce qui evite un bug de la fonction GUICtrlSetData

#include <file.au3>
#include <_Recuperation_CSV.au3>
#include <_Effacer_Ligne.au3>

Global $projet = GUICreate("Form1", 615, 792, 431, 138) ; On crée le projet
Global $csvLangue = _CSV2Array("C:\Langue.csv", ",") ; On converti le csv en tableau
Global $nameComboBoxLangue = $csvLangue[0][0] ; Colonne 0 Ligne 0 on saisi Titre de la liste déroulante

;On supprime les lignes vide
_ArrayDeleteEmptyRows($csvLangue)


;Initialisation liste déroulante;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Global $langue = GUICtrlCreateCombo($nameComboBoxLangue, 208, 584, 153, 25) ; Crée ComboBox
; Now add data
For $i=1 To Ubound($csvLangue)-1 ; Boucle
GUICtrlSetData($langue,$csvLangue[$i][0])
Next
_GUICtrlComboBox_SetEditText($langue, $nameComboBoxLangue) ; Défini titre même si occurence > 29
GUICtrlSendMsg($langue, $CB_SETMINVISIBLE, 15, 0)[/code] ; Afficher seulement 15 occurence


Fonction Qui supprime les lignes

Code : Tout sélectionner

; PERMET DE SUPPRIMER LES LIGNES VIDE DE LA FONCTION CI DESSUS
Func _ArrayDeleteEmptyRows(ByRef $_array)
	Local $dims = UBound($_array, 0), $fired = 0
	If Not IsArray($_array) Or $dims > 2 Then Return
	Switch $dims
		Case 1 ; array 1D
			Local $temp[UBound($_array)]
			For $i = 0 To UBound($_array) - 1
				If $_array[$i] = "" Then ; si ligne vide (ou autre condition)
					$fired += 1
					ContinueLoop ; passe à la ligne suivante
				EndIf
				$temp[$i - $fired] = $_array[$i]
			Next
			ReDim $temp[UBound($_array) - $fired]
		Case 2 ; array 2D
			Local $cols = UBound($_array, 2), $row = ""
			Local $temp[UBound($_array)][$cols]
			For $i = 0 To UBound($_array) - 1
				For $j = 0 To $cols - 1
					$row &= $_array[$i][$j] ; concatène la ligne
				Next
				If $row = "" Then ; si ligne vide (ou autre condition)
					$fired += 1
					ContinueLoop ; passe à la ligne suivante
				EndIf
				For $j = 0 To $cols - 1
					$temp[$i - $fired][$j] = $_array[$i][$j]
				Next
				$row = ""
			Next
			ReDim $temp[UBound($_array) - $fired][$cols]
	EndSwitch
	$_array = $temp
	$temp = ""
EndFunc   ;==>_ArrayDeleteEmptyRows

Func _Lire_Csv

Code : Tout sélectionner

#include <Array.au3>





 #FUNCTION# ===================================================================
; Name ..........: _CSV2Array
; Description ...:
; AutoIt Version : V3.3.0.0
; Syntax ........: _CSV2Array($hFile[, $cSeperator = "auto"[, $bFilterString = True[, $iColumnMode = 0]]])
; Parameter(s): .: $hFile       - Handle for the CSV file to Read
;                  $cSeperator  - Optional: (Default = "auto") : Tries to find the separator char (; or , or TAB or | or space)
;                               | Data-seperator-char
;                               | Empty-string = Opt("GUIDataSeparatorChar")
;                  $bFilterString - Optional: (Default = True) : Removes leading and trailing " or '
;                  $iColumnMode - Optional: (Default = 0) :
;                               | 0: Sets error if lines have different columns and @extended to the csv-line number
;                               | 1: returns lines with different columns numbers comparing to the first line, too
;                               | 2: removing all columns > column numbers in the first line
; Return Value ..: Success      - 2-dim Array
;                  Failure      - 0
;                  @ERROR       - 1: error file read
;                  @ERROR       - 2: different number of columns / @EXTENDED = CSV-line
;                               - 3: parameter error
; Author(s) .....: Thorsten Willert
; Date ..........: Mon Dec 07 18:59:46 CET 2009
; ==============================================================================
Func _CSV2Array($hFile, $cSeperator = "auto", $bFilterString = True, $iColumnMode = 0)
    Local $s = FileRead($hFile)
    If @error Then Return SetError(1)

    If $cSeperator = Default Then $cSeperator = "auto"
    If Not $cSeperator Then $cSeperator = Opt("GUIDataSeparatorChar")

    ; searching the line-seperator and splitting the lines into an array
    Local $aLines
    If StringInStr($s, @CRLF) Then
        $aLines = StringSplit($s, @CRLF, 1)
    ElseIf StringInStr($s, @CR) Then
        $aLines = StringSplit($s, @CR)
    Else
        $aLines = StringSplit($s, @LF)
    EndIf

    ; searching the delimiter in the first line
    Local $aTMP
    If $cSeperator = "auto" Then
        Local $iMax = 0
        Local $iC[5] = [0, 0, 0, 0, 0]
        Local $sC[5] = [";", ",", @TAB, "|", " "]

        $aTMP = StringRegExp($aLines[1], ";", 3)
        If Not @error Then $iC[0] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], ",", 3)
        If Not @error Then $iC[1] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "\t", 3)
        If Not @error Then $iC[2] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "\|", 3)
        If Not @error Then $iC[3] = UBound($aTMP)
        $aTMP = StringRegExp($aLines[1], "[ ]", 3)
        If Not @error Then $iC[4] = UBound($aTMP)

        For $i = 0 To UBound($sC) - 1
            If $iC[$i] > $iMax Then
                $iMax = $iC[$i]
                $cSeperator = $sC[$i]
            EndIf
        Next
    EndIf

    ; creating 2-dim array based on the number of data in the first line
    $aTMP = StringSplit($aLines[1], $cSeperator)
    Local $iCol = $aTMP[0]
    Local $aRet[$aLines[0]][$iCol]

    ; splitting and filling the lines
    For $i = 1 To $aLines[0]
        $aTMP = StringSplit($aLines[$i], $cSeperator)
        If @error Then ContinueLoop
        If $aTMP[0] > $iCol Then
            Switch $iColumnMode
                Case 0
                    Return SetError(2, $i)
                Case 1
                    ReDim $aRet[$aLines[0] - 1][$aTMP[0]]
                Case 2
                    $aTMP[0] = $iCol
                Case Else
                    Return SetError(3)
            EndSwitch
        EndIf
        For $j = 1 To $aTMP[0]
            $aTMP[$j] = StringStripWS($aTMP[$j], 3)

            ; removing leading and trailing " or '
            If $bFilterString Then $aTMP[$j] = StringRegExpReplace($aTMP[$j], '^("|'')(.*?)\1$', '$2')

            $aRet[$i - 1][$j - 1] = $aTMP[$j]
        Next ; /cols
    Next ; /lines

    Return $aRet
EndFunc   ;==>_CSV2Array






Merci pour vos propositions ça a beaucoup orienté mes recherches m'a beaucoup aidé
Répondre