[R] Trier un tableau en 2D

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
scorp84
Niveau 7
Niveau 7
Messages : 412
Enregistré le : mar. 04 nov. 2008 21:51
Localisation : Avignon, France
Status : Hors ligne

[R] Trier un tableau en 2D

#1

Message par scorp84 »

Bonjour,

Je me permets de faire une fois de plus appel à vous après avoir cherché en vain sur les forums la solution à mon problème.

Je suis entrain de développer un lanceur d'applications qui va lire un fichier texte qui se présente sous la forme suivante :

60 C:\Program Files\Microsoft Office\OFFICE11\OUTLOOK.EXE
30 C:\Program Files\POST-NET\Post-Net.exe
...

Le premiers nombre représente le nombre de secondes avant de lancer l'appli et le second bloc représente le chemin de l'appli.

Hors afin de savoir l'ordre chronologique, il me faut trier le tableau en 2D.

Voici mon script :

Code : Tout sélectionner

#include <Array.au3>
#include <file.au3>

$fichier_txt="test.txt"

$file = FileOpen($fichier_txt, 0)


; Check if file opened for reading OK
If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

$ligne_en_cours=0

; Nb ligne fichier
$nb_ligne=Number(_FileCountLines($fichier_txt)+1)

[color=#FF0000]Dim $tab_prg[$nb_ligne][2][/color]

; Read in lines of text until the EOF is reached
While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
        
    $separatif = StringInStr($line, " ")

    $tab_prg[$ligne_en_cours][0]=StringLeft($line, $separatif-1)
    $tab_prg[$ligne_en_cours][1]=StringRight($line, StringLen($line)-$separatif)
    
    
    ;MsgBox(0, $ligne_en_cours, $tab_prg[$ligne_en_cours])

$ligne_en_cours=$ligne_en_cours+1
Wend

[color=#FF0000];_ArraySort($tab_prg,1,1)[/color]
_ArrayDisplay($tab_prg, "_ArrayDisplay() Test")

FileClose($file)

 
J'arrive bien à les mettre en tableau en 2D mais j'ai le problème suivant :

1. Comment ne pas lui dimensionner le tableau au départ et le faire de manière dynamique (car je ne sais pas le nombre de lignes) autrement qu'en lisant le fichier.

2. Quand j'essaye de trier le tableau avec la fonction _ArraySort, je n'arrive pas à lui dire sur quelle colonne je veux trier et j'obtiens l'erreur suivante :

Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
$t = $array[$i]
$t = ^ ERROR


Comment puis je lui dire que je veux trier numériquement la colonne 0.

Merci d'avance pour votre aide.

Cordialement.

BM
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#2

Message par ani »

Si je comprend bien, vous voudriez obtenir la colonne 0 du plus petit au plus grand ?

Code : Tout sélectionner

_ArraySort($tab_prg,0,0,0,0)
SI c'est du plus grand au plus petit

Code : Tout sélectionner

_ArraySort($tab_prg,1,0,0,0)
Le dernier paramétre sert pour les tableaux à deux dimensions
Colonne 0 = 0
Colonne 1 = 1
ect ...

Mais en visionnant votre script, le array contiendra un élèment vide du à cette ligne

Code : Tout sélectionner

; Nb ligne fichier
$nb_ligne=Number(_FileCountLines($fichier_txt)+1)
vous ajoutez à cette variable $nb_ligne l'indice 1.
En le retirant sa serait mieux à mon avis ;)
consolewrite(UBound($tab_prg)) < ceux-ci vous renverra bien x élèment, si vous retirez le + 1 au nbre de ligne ;)

Sinon au lieu d'ouvrir le fichier et de le fermer, y a une jolie petite fonction dans une des include utilisé ;) _FileReadToArray
Exemple avec votre script

Code : Tout sélectionner

#include <Array.au3>
#include <file.au3>
; Déclaration des variables
Dim $aRecords, $fichier_txt,$ligne_en_cours,$separatif

$fichier_txt="test.txt"

If Not _FileReadToArray($fichier_txt,$aRecords) Then
   MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
   Exit
EndIf

; Nb ligne fichier
$nb_ligne=$aRecords[0]

Dim $tab_prg[$nb_ligne][2] ; ou $tab_prg[$aRecords[0]][2] en décommentant $nb_ligne

$ligne_en_cours=0
For $x = 1 to $aRecords[0]       
    $separatif = StringInStr($aRecords[$x], " ")
    $tab_prg[$ligne_en_cours][0]=StringLeft($aRecords[$x], $separatif-1)
    $tab_prg[$ligne_en_cours][1]=StringRight($aRecords[$x], StringLen($aRecords[$x])-$separatif)
    $ligne_en_cours=$ligne_en_cours+1
Next

_ArrayDisplay($tab_prg, "_ArrayDisplay() Test")
_ArraySort($tab_prg,1, 0, 0, 0)
_ArrayDisplay($tab_prg, "_ArrayDisplay() Test")
bonne continuation
Avatar du membre
scorp84
Niveau 7
Niveau 7
Messages : 412
Enregistré le : mar. 04 nov. 2008 21:51
Localisation : Avignon, France
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#3

Message par scorp84 »

Super !

Un grand merci pour cette réponse rapide qui va me débloquer :-)

Je teste ça et vous tiens au courant.

Merci encore pour votre aide.

Amicalement.

BM
Avatar du membre
scorp84
Niveau 7
Niveau 7
Messages : 412
Enregistré le : mar. 04 nov. 2008 21:51
Localisation : Avignon, France
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#4

Message par scorp84 »

Bonjour,

J'ai testé votre code et il me sort bien l'affichage du premier tableau mais une fois que je ferme la fenêtre du 1er tableau, il me met l'erreur suivante :

Code : Tout sélectionner

>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "S:\Autres\Lanceur\Lanceur.au3"    
C:\Program Files\AutoIt3\Include\Array.au3 (721) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: 
WEnd 
WEnd^ ERROR
 
Chose qu'il ne fait plus si je modifie la ligne suivante :
For $x = 1 to $aRecords[0] en For $x = 1 to $aRecords[0]-1

Si je rajoute -1 à la boucle, il m'affiche 2 fois le tableau mais le second n'est toujours pas trié par ordre croissant de ma colonne 0.

Merci d'avance pour votre aide.

Amicalement.

BM
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#5

Message par ani »

déjà l'erreur wend ce mot n'est pas dans le code indiqué plus haut (je vous l'es posté avec un for) ;)

avec votre code

Code : Tout sélectionner

#include <Array.au3>
#include <file.au3>

;Déclaration des variables
Dim $fichier_txt, $file,$ligne_en_cours, $nb_ligne, $separatif
$fichier_txt="test.txt"

$file = FileOpen($fichier_txt, 0)

; Check if file opened for reading OK
If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

; Nb ligne fichier [color=#FF0000]PAS BESOIN DU + 1[/color]
$nb_ligne=Number(_FileCountLines($fichier_txt))

Dim $tab_prg[$nb_ligne][2]

$ligne_en_cours=0
; Read in lines of text until the EOF is reached
While 1
    $line = FileReadLine($file)
    If @error = -1 Then ExitLoop
    $separatif = StringInStr($line, " ")
    $tab_prg[$ligne_en_cours][0]=StringLeft($line, $separatif-1)
    $tab_prg[$ligne_en_cours][1]=StringRight($line, StringLen($line)-$separatif)
    ;MsgBox(0, $ligne_en_cours, $tab_prg[$ligne_en_cours])
    $ligne_en_cours=$ligne_en_cours+1
Wend

FileClose($file)

_ArraySort($tab_prg,1,0,0,0)
_ArrayDisplay($tab_prg, "_ArrayDisplay() Decroissant_Test")
_ArraySort($tab_prg,0,0,0,0)
_ArrayDisplay($tab_prg, "_ArrayDisplay() Croissant_Test")
Avatar du membre
scorp84
Niveau 7
Niveau 7
Messages : 412
Enregistré le : mar. 04 nov. 2008 21:51
Localisation : Avignon, France
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#6

Message par scorp84 »

Bonjour,

Merci encore pour votre aide et votre patience ;-)

Effectivement votre code ne comportait pas de WEnd. Du coup, j'ai repris le vôtre mais j'obtiens la même erreur.

En essayant d'isoler les éléments un par un pour voir d'où venait le problème, je me suis aperçu que l'erreur venait de la fonction "_ArraySort($tab_prg,1, 0, 0, 0)" dans le fichier "../Include\Array.au3".

Code : Tout sélectionner

>"C:\Program Files\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "S:\Autres\Lanceur\Lanceur.au3"    
[color=#FF0000]C:\Program Files\AutoIt3\Include\Array.au3[/color] (721) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.: 
WEnd 
WEnd^ ERROR
 
Car quand je commente la fonction "_ArraySort", il m'affiche bien deux fois le tableau et n'affiche plus d'erreur.

Comment pensez vous que je puisse résoudre mon souci ?

Merci encore ;-)

Amicalement.

BM
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#7

Message par ani »

Quel est votre version de l'include array ? chez moi j'ai la version au3 ..v3.2.12.1 (d'origine) et non l'include proposé par tolf

SI c'est pour cette ligne ;MsgBox(0, $ligne_en_cours, $tab_prg[$ligne_en_cours])
il faut indiquer au tab_prg l'indice a affiché => MsgBox(0, $ligne_en_cours, $tab_prg[$ligne_en_cours][1])

vous avez ajouté d'autre élèment à votre script ? ou il est tel quel ?
Avatar du membre
scorp84
Niveau 7
Niveau 7
Messages : 412
Enregistré le : mar. 04 nov. 2008 21:51
Localisation : Avignon, France
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#8

Message par scorp84 »

Euréka !

J'ai trouvé : il fallait avant d'insérer le nombre dans le tableau que je le convertisse en nombre :

Code : Tout sélectionner

$tab_prg[$ligne_en_cours][0]=[color=#FF0000]Number([/color]StringLeft($aRecords[$x], $separatif-1)[color=#FF0000])[/color]
Voici le code complet qui fonctionne :
► Afficher le texte
Merci encore pour votre aide rapide et votre patience.

Cordialement.

BM
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Trier un tableau en 2D

#9

Message par ani »

C'est quand même étrange que vous obtenez une erreur et pas moi .
quand un post est résolu il faut éditer le premier post et non le dernier ;)

Quel version d'autoit disposez-vous ?

bonne continuation
Répondre