[R] FileGetTime tableau multidimensionnel

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
lithiumrock
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 07 sept. 2015 16:53
Status : Hors ligne

[R] FileGetTime tableau multidimensionnel

#1

Message par lithiumrock »

Bonjour,

J'aurais besoins d'un peu d'aide s'il vous plait.

D'une part j'ai pas vraiment l'habitude d'utiliser les tableau multi dimensionnels donc je ne sais pas si je m'y prend correctement ou pas.

J'essaie de faire un logiciel qui clique dans un navigateur selon un endroit sélectionné par l'utilisateur, sur un emplacement ou se trouve un champ pour entrer des éléments dans une base de données. Voila le contexte :)

Pour cela j'ai besoins d'une fonction qui trie les noms des fichiers que je récupère quelque part par un FileSelectFolder. Ensuite je transforme en array le nom des éléments que je récupère par un _FileListToArray. Jusque la tout se passe bien. C'est a ce moment que je fais appel à une fonction Organise qui trie les fichiers par ordre d'ancienneté. Dans cette fonction je crée un tableau destiné à contenir les années, mois, jours, heures, minutes et secondes à la quel les fichiers ont étés crées.

Et c'est la que je ne sais pas si c'est ma syntaxe qui est fausse, si le tableau est pas assez grand(j'ai essayé de l'agrandir ça n'a pas fonctionné), si cela ne fonctionne qu'avec des variables normales ou encor si les deux dimensions du tableau sont du même type ou ont besoins de l'être.

Bref j'ai cet erreur:

Array variable has incorrect number of subscripts or subscript dimension range exceeded

Voici le code:

Code : Tout sélectionner

;~ Fonction qui trie les fichiers d'un dossier selon leur anciennete (prend en parametre le nom du fichier et le chemin vers ce fichier
Func _Organise($files, $path)
;~  creation et initialisation de la variable d'incrementation de la premiere boucle
    local $i = $files[0]
;~  creation du tableau qui vas stocker les dates de creation
    local $filetimes[$files[0]][7]
 
    ;~  boucle d'initialisation du tableau qui vas stocker les dates de creation, c'est a ce niveau que j'ai l'erreur
    while $i>0
        $filetimes[$i] = FileGetTime($path&"\"&$files[$i],1)
        $i-=1
    WEnd
 
    $i=$files[0]
 
    While $i>0
        $j=$files[0]
        While $j>0
;~          on teste si l'annee du fichier i est plus grande qu'une autre situe dans le tableau
            If $filetimes[$i][0]>$filetimes[$j][0] Then
;~              si c'est le cas on remplace cette valeur par la valeur selectionnee actuellement
                $tempfile = $files[$i]
                $files[$i] = $files[$j]
                $files[$j] = $tempfile
            ElseIf $filetimes[$i][0]=$filetimes[$j][0] Then
                If $filetimes[$i][1]>$filetimes[$j][1] Then
                    $tempfile = $files[$i]
                    $files[$i] = $files[$j]
                    $files[$j] = $tempfile
                ElseIf $filetimes[$i][1]=$filetimes[$j][1] Then
                    If $filetimes[$i][2]>$filetimes[$j][2] Then
                        $tempfile = $files[$i]
                        $files[$i] = $files[$j]
                        $files[$j] = $tempfile
                    ElseIf $filetimes[$i][2]=$filetimes[$j][2] Then
                        If $filetimes[$i][3]>$filetimes[$j][3] Then
                            $tempfile = $files[$i]
                            $files[$i] = $files[$j]
                            $files[$j] = $tempfile
                        ElseIf $filetimes[$i][3]=$filetimes[$j][3] Then
                            If $filetimes[$i][4]>$filetimes[$j][4] Then
                                $tempfile = $files[$i]
                                $files[$i] = $files[$j]
                                $files[$j] = $tempfile
                            ElseIf $filetimes[$i][4]=$filetimes[$j][4] Then
                                If $filetimes[$i][5]>$filetimes[$j][5] Then
                                    $tempfile = $files[$i]
                                    $files[$i] = $files[$j]
                                    $files[$j] = $tempfile
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
            $j-=1
        WEnd
        $i-=1
    WEnd
    Return $files
EndFunc
 
Merci d'avance pour vos réponses.

N'hésitez pas à me faire part de vos critiques sur la syntaxe ou ma manière de m'y prendre pour trier mes éléments aussi :)
Modifié en dernier par lithiumrock le lun. 07 sept. 2015 22:58, modifié 1 fois.
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [..] FileGetTime tableau multidimensionnel

#2

Message par mdanielm »

Bonsoir,
Quelques éléments de réponses qui vont te permettre de continuer ton travail de débutant (mais pas la solution!)

FileGetTime utilisée avec l'option 0 retourne un tableau
FileGetTime utilisée avec l'option 1 retourne une chaîne

Or, toi tu définit un tableau à 7 colonnes mais tu utilises l'option 1 !!!

Je te conseille l'option 1, tu éviteras tes cascades de if

Tu peux aussi créer, même si elle existe en AutoIt (je ne sais plus trop) une fonction Permut qui évitera toutes tes répétitions.

Enfin j'ai eu du mal à comprendre ta question: tu dis $files c'est le nom DU fichier alors que c'est un tableau:
-n'hésite pas à gaspiller une ligne par paramètre pour le décrire avec précision.

Si on sait ce que doit faire la Func, c'est plus facile pour nous.

Il existe des tries dans Autoit, mais je te laisse programmer ton trie par permutation:
-------------------- IL FAUT réinventer la roue pour apprendre à programmer -------------------------------------

Courage
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1038
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] FileGetTime tableau multidimensionnel

#3

Message par walkson »

Bonjour,
Je suis comme mdanielm, un peu perdu.
Après une rapide lecture: $filetimes[$i] = FileGetTime($path&"\"&$files[$i],1) ne marche pas car: local $filetimes[$files[0]][7] (array 1D ou 2D ?)

Vous pouvez trier un array avec _ArraySort ()
et il y a aussi _FileListToArrayRec() qui permet de faire un trie.
Autrement, pour éviter des If..Then il y a Switch...Case...EndSwitch ou Select...Case...EndSelect qui sont beaucoup plus simples et plus rapides
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
lithiumrock
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 07 sept. 2015 16:53
Status : Hors ligne

Re: [..] FileGetTime tableau multidimensionnel

#4

Message par lithiumrock »

Merci à vous pour vos réponses

Alors oui les files[$i] sont mes fichiers en fait je les récupère au préalable avec _FilesToArray :

Code : Tout sélectionner

; Je vais chercher mes fichiers dans un repertoire que j'ai obtenu precedement par un bouton sur une forme avec FileSelectDirectory
$fileList = _FileListToArray($directorytoinsert)
; vu que la premiere ligne du tableau contient le nombre d'elements je l'utilise pour l'incrementation de ma boucle
         $FileNumber = $fileList[0]
; je trie mes fichiers par date de creation, c'est pour celaque j'ai nécéssairement besoin de l'option 1
         $fileList = _Organise($fileList, $directorytoinsert)
; ensuite je me contente d'afficher les fichiers triés dans un EDIT
         while $FileNumber
             GUICtrlSetData($Edit1,$fileList[$FileNumber]&@CRLF,$FileNumber)
             $FileNumber-=1
         WEnd
 
Je ne suis pas sur qu'un simple arraySort() suffise à trier une array de date de création vu que d'après ce que j'ai lu la fonction FileGetTime devrait me renvoyer une année un moi, un jour, les heures, les minutes, les secondes enfin c'est clairement ce qui est écrit dans la doc https://www.autoitscript.com/autoit3/do ... etTime.htm

Donc je suis daccord que je pourrais utiliser la fonction permut mais enlever mes if je ne vois pas comment et comment je peut récupérer la chaine que me renvoie l'option 1 avec un tableau 2 dimension si c'est possible? Et si ça ne l'est pas comment on fait pour comparer les dates de création de fichier pour les trier par ordre d'anciènnetée? Et je confirme bien que la fonction FileGetTime() me renvoir un array de 6 chaines de caractère! Je suis désolé mais la doc est assez peu renseignée sur cette fonction et je manque cruellement d'experience.

Je suis vraiment désolé si je m'exprime mal sur ce que je veux faire précisément, n'hésitez surtout pas a me demander plus d'informations. Encor une fois merci pour les réponses déjà écrites et merci d'avance pour les réponses avenir.
lithiumrock
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 07 sept. 2015 16:53
Status : Hors ligne

Re: [..] FileGetTime tableau multidimensionnel

#5

Message par lithiumrock »

Bon au final j'ai fait comme ça

Code : Tout sélectionner

    
While $i>0
        $itimes = FileGetTime($path&"\"&$files[$i],1)
        $j=$files[0]
        While $j>0
            $jtimes = FileGetTime($path&"\"&$files[$j],1)
;~          on teste si l'annee du fichier i est plus grande qu'une autre situe dans le tableau
            If $itimes[0]>$jtimes[0] Then
;~              si c'est le cas on remplace cette valeur par la valeur selectionnee actuellement
                $tempfile = $files[$i]
                $files[$i] = $files[$j]
                $files[$j] = $tempfile
            ElseIf $itimes[0]=$jtimes[0] Then
                If $itimes[1]>$jtimes[1] Then
                    $tempfile = $files[$i]
                    $files[$i] = $files[$j]
                    $files[$j] = $tempfile
                ElseIf $itimes[1]=$jtimes[1] Then
                    If $itimes[2]>$jtimes[2] Then
                        $tempfile = $files[$i]
                        $files[$i] = $files[$j]
                        $files[$j] = $tempfile
                    ElseIf $itimes[2]=$jtimes[2] Then
                        If $itimes[3]>$jtimes[3] Then
                            $tempfile = $files[$i]
                            $files[$i] = $files[$j]
                            $files[$j] = $tempfile
                        ElseIf $itimes[3]=$jtimes[3] Then
                            If $itimes[4]>$jtimes[4] Then
                                $tempfile = $files[$i]
                                $files[$i] = $files[$j]
                                $files[$j] = $tempfile
                            ElseIf $itimes[4]=$jtimes[4] Then
                                If $itimes[5]>$jtimes[5] Then
                                    $tempfile = $files[$i]
                                    $files[$i] = $files[$j]
                                    $files[$j] = $tempfile
                                EndIf
                            EndIf
                        EndIf
                    EndIf
                EndIf
            EndIf
            $j-=1
        WEnd
        $i-=1
    WEnd
    Return $files
EndFunc
 
Je ne suis pas sur que ce soit bien optimisé par contre par exemple de cette manière si j'ai 100 fichiers la fonction FileGetTime sera appelée 10000 fois...

Comment on fait pour mettre le sujet en résolu?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1038
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: [..] FileGetTime tableau multidimensionnel

#6

Message par walkson »

► Afficher le texte
Est ce le résultat que vous espériez avec ce script ?

(Si le problème est résolu, il faut mettre [R] dans votre premier poste)
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
lithiumrock
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 07 sept. 2015 16:53
Status : Hors ligne

Re: [R] FileGetTime tableau multidimensionnel

#7

Message par lithiumrock »

Oui c'est bien le résultat que j'attendais merci walkson !
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: [R] FileGetTime tableau multidimensionnel

#8

Message par mdanielm »

Il ne te rend pas service en te donnant la solution.
Tu étais très loin du résultat.
Avant d'utiliser Quicksort, il faudrait comprendre l'algorithme, le programmer toi même, j'aurais voulu que tu commence par programmer un tri par permutation.
lithiumrock
Niveau 1
Niveau 1
Messages : 5
Enregistré le : lun. 07 sept. 2015 16:53
Status : Hors ligne

Re: [R] FileGetTime tableau multidimensionnel

#9

Message par lithiumrock »

Si ça peut te rassurer j'ai pas utilisé sa solution car je pense qu'elle ne me permet pas de trier mes dates de créations comme je le veux, et que je ne comprend pas comment lui le fait :) en fait je pense que dans son tableau au final j'aurais [secondes][secondes][secondes][secondes][minutes][minutes][minutes][minutes][heures][heures][heures][heures]...
or moi ce que je veut obtenir c'est element1 [secondes][minutes][heures] element2[secondes][minutes][heures]... en faisant en sorte que si l'année de l'element1 est supérieur aux années de l'element2 on effectue pas de tests supplémentaires et si elle est égal alors on vérifie les mois...

Voila et utiliser la fonction permut ne représente pas vraiment une optimisation puisqu'elle fait exactement la même chose que ma permutation sauf qu'il faut que le programme aille chercher la fonction...

En gros le programme final est censé insérer tous les fichiers trouvé dans une dossier dans une base de donnée.

Enfin merci pour vos réponses encor une fois.
Répondre