Gambas France BETA


Pas de compte ? Incription

importation de fichier TXT dans un tableau puis effectuer des Tris

123456
AuteurMessages
Invité#1 Posté le 2/8/2010 à 11:11:00
Bonjour,

Je début dans le monde de la programmation sur gambas.

je désire importer un fichier txt dans un tableau pour par la suite faire un tri sur celui-ci

fichier brute

30/07/10 06:00:08 CLVCPTB10001 nvoEffectOccup OC_UNOCCUPIED
30/07/10 06:00:08 CLVCPTB10001 nvoSpaceTemp 21.62
30/07/10 06:00:08 CLVCPTB10001 nvoSetptOffset 0.00
30/07/10 06:00:08 CLVCPTB10001 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 06:00:08 CLVCPTB10002 nvoEffectOccup OC_UNOCCUPIED
30/07/10 06:00:08 CLVCPTB10002 nvoSpaceTemp 25.63
30/07/10 06:00:08 CLVCPTB10002 nvoSetptOffset 0.00
30/07/10 06:00:08 CLVCPTB10002 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 06:20:10 CLVCPTB10001 nvoEffectOccup OC_UNOCCUPIED
30/07/10 06:20:10 CLVCPTB10001 nvoSpaceTemp 21.50
30/07/10 06:20:10 CLVCPTB10001 nvoSetptOffset 0.00
30/07/10 06:20:10 CLVCPTB10001 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 06:20:10 CLVCPTB10002 nvoEffectOccup OC_UNOCCUPIED
30/07/10 06:20:10 CLVCPTB10002 nvoSpaceTemp 25.63
30/07/10 06:20:10 CLVCPTB10002 nvoSetptOffset 0.00
30/07/10 06:20:10 CLVCPTB10002 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 06:40:12 CLVCPTB10001 nvoEffectOccup OC_UNOCCUPIED
30/07/10 06:40:12 CLVCPTB10001 nvoSpaceTemp 21.38
30/07/10 06:40:12 CLVCPTB10001 nvoSetptOffset 0.00
30/07/10 06:40:12 CLVCPTB10001 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 06:40:12 CLVCPTB10002 nvoEffectOccup OC_UNOCCUPIED
30/07/10 06:40:12 CLVCPTB10002 nvoSpaceTemp 25.63
30/07/10 06:40:12 CLVCPTB10002 nvoSetptOffset 0.00
30/07/10 06:40:12 CLVCPTB10002 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 07:00:05 CLVCPTB10001 nvoEffectOccup OC_UNOCCUPIED
30/07/10 07:00:05 CLVCPTB10001 nvoSpaceTemp 21.38
30/07/10 07:00:05 CLVCPTB10001 nvoSetptOffset 0.00
30/07/10 07:00:05 CLVCPTB10001 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 07:00:05 CLVCPTB10002 nvoEffectOccup OC_UNOCCUPIED
30/07/10 07:00:05 CLVCPTB10002 nvoSpaceTemp 25.63
30/07/10 07:00:05 CLVCPTB10002 nvoSetptOffset 0.00
30/07/10 07:00:05 CLVCPTB10002 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,0.000,0
30/07/10 07:20:07 CLVCPTB10001 nvoEffectOccup OC_OCCUPIED
30/07/10 07:20:07 CLVCPTB10001 nvoSpaceTemp 23.41
30/07/10 07:20:07 CLVCPTB10001 nvoSetptOffset 0.00
30/07/10 07:20:08 CLVCPTB10001 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,33.000,0
30/07/10 07:20:08 CLVCPTB10002 nvoEffectOccup OC_OCCUPIED
30/07/10 07:20:08 CLVCPTB10002 nvoSpaceTemp 24.77
30/07/10 07:20:08 CLVCPTB10002 nvoSetptOffset 1.00
30/07/10 07:20:08 CLVCPTB10002 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,33.000,0
30/07/10 07:40:10 CLVCPTB10001 nvoEffectOccup OC_OCCUPIED
30/07/10 07:40:10 CLVCPTB10001 nvoSpaceTemp 23.92
30/07/10 07:40:10 CLVCPTB10001 nvoSetptOffset -3.00
30/07/10 07:40:10 CLVCPTB10001 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,33.000,0
30/07/10 07:40:10 CLVCPTB10002 nvoEffectOccup OC_OCCUPIED
30/07/10 07:40:10 CLVCPTB10002 nvoSpaceTemp 24.53
30/07/10 07:40:10 CLVCPTB10002 nvoSetptOffset 2.00
30/07/10 07:40:10 CLVCPTB10002 nvoUnitStatus HVAC_COOL,0.000,0.000,163.835,163.835,33.000,0


je voudrais trié par exemple ces deux paramètre CLVCPTB10001 nvoSpaceTemp

30/07/10 06:00:08 CLVCPTB10001 nvoSpaceTemp 21.62
30/07/10 06:20:10 CLVCPTB10001 nvoSpaceTemp 21.50
30/07/10 06:40:12 CLVCPTB10001 nvoSpaceTemp 21.38
30/07/10 07:00:05 CLVCPTB10001 nvoSpaceTemp 21.38
30/07/10 07:40:10 CLVCPTB10001 nvoSpaceTemp 23.92



Par la suite le but est de faire un graphique de la température en fonction de l'heure de la journée.



merci




Prokopy#2 Posté le 2/8/2010 à 13:59:00
Kinder PinguiSalut et bienvenue à toi defcom,

Je pense avoir trouvé la solution à ton problème, mais il faut le séparer en plusieurs parties :

Tout d'abord, il faut ouvrir et parcourir ton fichier. Il faut donc pour commencer déclarer une variable pour ton fichier et une autre pour la ligne actuellement parcourue :

1
DIM fichier AS File DIM ligne AS STRING


Ensuite, il faut ouvrir ton fichier. J'ai ici supposé que le fichier en question s'appelait Donnees.txt et qu'il était inclus dans le projet :

1
fichier = OPEN "Donnees.txt" FOR INPUT


Puis on parcourt le fichier ligne par ligne dans une boucle :

1
WHILE NOT Eof(fichier) LINE INPUT #fichier, ligne WEND


Ensuite, pour faire le tri, il faut une condition qui permette de détecter si l'on a bien dans la ligne les mots nvoSpaceTemp et CLVCPTB10001. On va le faire grâce à la fonction InStr :

1
IF String.InStr(ligne, "nvoSpaceTemp") AND String.InStr(ligne, "CLVCPTB10001") ENDIF


Ensuite, on va créer deux tableaux qui vont contenir respectivement les heures et les températures :

1
DIM dates AS NEW Date[] DIM temperatures AS NEW Float[]


Puis vient le moment de récupérer les dates et les températures dans la ligne. Pour cela, on va se baser sur le fait que la date est écrite dans les 18 premiers caractères de la ligne (oui j'ai compté :P ). On va donc les récupérer grâce à la fonction Left(), puis les transformer en Date avec la fonction Val() et enfin les ajouter dans le tableau :

1
dates.Add(Val(Left(ligne, 18)))


Et on fait de même avec les températures :

1
temperatures.Add(CFloat(Right(ligne, 5)))


Et maintenant, on a deux tableaux qui sont prêts à être utilisés pour faire des beaux graphiques.
Je remets le code complet :

1
DIM fichier AS File DIM ligne AS STRING DIM dates AS NEW Date[] DIM temperatures AS NEW Float[] fichier = OPEN "Donnees.txt" FOR INPUT WHILE NOT Eof(fichier) LINE INPUT #fichier, ligne IF String.InStr(ligne, "nvoSpaceTemp") AND String.InStr(ligne, "CLVCPTB10001") dates.Add(Val(Left(ligne, 18))) temperatures.Add(CFloat(Right(ligne, 5))) ENDIF WEND


Voilà, en espérant t'avoir aidé. Si tu as quelque chose que tu ne comprend pas, n'hésite pas à demander. ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
Invité#3 Posté le 2/8/2010 à 15:02:00
merci Prokopy pour cette réponse.


j'ai commencé à travailler sur le graphique pour voir ce que cela donne mais j'ai un petit problème de syntaxe pour intégré les tableaux dates et températures

[/code]
Chart.CountDataSets = 1
Chart.Headers.Values = dates
Chart[0].Values =temperatures
Chart[0].Text = "courbe 1"

Chart.Type = ChartType.LinesStacked
Chart.Legend.Visible = TRUE
END

PUBLIC SUB DrawingArea1_Draw()
Chart.Width = DrawingArea1.Width
Chart.Height = DrawingArea1.Height
'pour tracer le graphique dans la DrawingArea
Chart.Draw

END

1
2
3
4
5
6
l'erreur et au niveau des lignes suivante.

Chart.Headers.Values = dates
Chart[0].Values =temperatures

cela fonctionne quand je remplace dates et Températures par une serie de valeur.
Prokopy#4 Posté le 2/8/2010 à 15:52:00
Kinder PinguiAh oui. En fait Chart.Headers.Values attend un tableau de String, pas un tableau de Dates…
Mets le tableau dates en un String[], puis vire la fonction Val() et ça devrait aller mieux. ;)

En clair :

1
DIM fichier AS File DIM ligne AS STRING DIM dates AS NEW String[] DIM temperatures AS NEW Float[] fichier = OPEN "Donnees.txt" FOR INPUT WHILE NOT Eof(fichier) LINE INPUT #fichier, ligne IF String.InStr(ligne, "nvoSpaceTemp") AND String.InStr(ligne, "CLVCPTB10001") dates.Add(Left(ligne, 18)) temperatures.Add(CFloat(Right(ligne, 5))) ENDIF WEND


Pardon pour cette ch'tite étourderie. :oops:

PS : Si Gambix passe par là, c'est vrai que ce serait bien que les headers puissent être des dates, non ? ;)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
defcom#5 Posté le 2/8/2010 à 16:19:00
il y a encore une petit problème j'ai éxéxuter le programme pas à pas mais en aucun cas on passe sur les lignes.

1
dates.Add(Left(ligne, 18))temperatures.Add(CFloat(Right(ligne, 5)))


on dirait que la condition du dessus est toujours fausse.

Prokopy#6 Posté le 2/8/2010 à 16:42:00
Kinder PinguiAh tiens c'est bizarre, chez moi ça marche parfaitement …
Est-ce que les tableaux sont bien remplis à la fin ? Le graphique est bien affiché ? :scratch:
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
defcom#7 Posté le 2/8/2010 à 18:37:00
non le tableau ne ce rempli pas et la graph plante avec comme message :


The values count must be up than 1.

j'ai même fait un copier coller du fichier brut cité au début du sujet pour être sur qu'il y a pas de problème de nom de variable.


Prokopy#8 Posté le 2/8/2010 à 18:53:00
Kinder PinguiEst-ce que ça marche mieux avec cette condition-là :

1
IF String.InStr(ligne, "nvoSpaceTemp") > 0 AND String.InStr(ligne, "CLVCPTB10001") > 0


Des fois que ce serait un problème de version …
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
defcom#9 Posté le 2/8/2010 à 18:55:00
ca fonctionne.

merci
defcom#10 Posté le 2/8/2010 à 19:14:00
une autre question comme fait on pour afficher les valeurs du tableau comme la température dans un lablel par exemple.

j'ai trouvé pour une valeur

Label1.Caption = temperatures[1]

mais comment fait on pour la série complète.
Prokopy#11 Posté le 2/8/2010 à 19:18:00
Kinder PinguiBen tu fais une boucle qui parcourt le tableau et qui à chaque tour ajoute la valeur au label.
Exemple :

1
DIM i AS IntegermonLabel.Text = ""FOR i = 0 TO temperatures.Maxmonlabel.Text &= temperatures[i] & "\n"NEXT


Voilà. :)
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
defcom#12 Posté le 2/8/2010 à 20:56:00
Merci de toutes ces réponses j'ai appris pas mal de chose avec c'est quelque exemple.

comment faire pour décomposer la recherche et le chargement du fichier.

je désir chargé tout le fichier en premier et par la suite faire le tri cela évite de recharger le fichier à chaque recherche.




Prokopy#13 Posté le 2/8/2010 à 22:36:00
Kinder PinguiExcuse-moi mais j'ai du mal à saisir l'intérêt de ce que tu veux faire… car si tu redemandes les données, c'est bien parce que il y a besoin d'une ré-actualisation, et donc d'un nouveau chargement de fichier, non ?
La théorie, c'est quand on sait tout et que rien ne fonctionne.
La pratique, c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique, rien ne fonctionne et on ne sait pas pourquoi.
manu#14 Posté le 3/8/2010 à 07:41:00
Avec Gambas ca roule !Defcom :

Le fichier n'est chargé qu'une fois par la ligne suivante :

1
fichier = OPEN "Donnees.txt" FOR INPUT



Puis le tri est fait par la boucle, comme tu le veux. On peu pas faire plus simple....

Prokopy :

J'ai vu quelque part que tu souhaitais faire un megatutoriel pour Gambas. Ou en est tu dans ce projet ?
Jeanne d'arc, elle a frit, elle a tout compris ! ;)

Config :
Manjaro linux (excellent !)
XFCE 4.1 (simple et efficace)
Gambas 3 dans les dépots (confort total)
defcom#15 Posté le 3/8/2010 à 08:26:00
Voila ce que je veut faire en plus détailler:

Dans un répertoire j'ai des dossiers qui ressemble à

TB0004
TB0509
TB1014
TB1519
TA0004
TA0509
etc ...

par exemple dans le répertoire TB1014 il y a des fichiers qui ressemble à

TB1014_03082020_0700.txt
TB1014_03082020_0720.txt
TB1014_03082020_0740.txt
TB1014_03082020_0800.txt
etc...

l'utilisateur sélectionne une TOUR (exemple TB par intermédiaire de bouton), puis un ETAGE (exemple étage 10 par intermédiaire bouton) ce qui a pour conséquence de pointer dans le répertoire TB1014,
Charge le fichier qui on la même nom TB1014 avec la date en cours (03082010).
puis j'affiche dans des LABEL les températures qui correspond au fichier le plus récent (exemple 0800)

explication sur la variable CLVCPTB10001
CLVCP (fixe ne change jamais), TB (TOUR), 10 (Étage), 001 (Numéro de clim)

Donc le premier Label s'appelle Label1 (par exemple) doit afficher la température de la clim CLVCPTB10001
le deuxième Label s'appelle Label2 doit afficher la température de la clim CLVCPTB10002
etc ...


Voila en gros mon projet.

existe t'il des variables global sur gambas pour définir comme variable TOUR, ETAGE, CLIM.
je veut faire une fonction générique avec les paramètre précèdent comme variable.

Exemple:


SUB chargement (TOUR as string, ETAGE as interger, CLIM as interger)

DIM fichier AS File
DIM ligne AS String
DIM dates AS NEW String[]
DIM temperatures AS NEW Float[]
DIM decalage AS NEW Float[]
DIM i AS Integer
DIM TOUR AS String
DIM ETAGE AS Integer
DIM CLIM AS Integer
DIM numero AS String

fichier = OPEN "Donnees.txt" FOR INPUT

WHILE NOT Eof(fichier)
numero = ("CLVCP" & TOUR & ETAGE & Format(CLIM, "000"))
LINE INPUT #fichier, ligne
IF String.InStr(ligne, "nvoSpaceTemp") > 0 AND String.InStr(ligne, numero) > 0
dates.Add(Left(ligne, 18))
temperatures.Add(CFloat(Right(ligne, 5)))
ENDIF
WEND


d'où ma question sur les variable global.

123456