Page 1 sur 1

Séparer les données d'une ligne de texte [RESOLU]

Publié : dim. 31/août/2008 17:50
par MetalOS
Salut tous le monde. Bon je m'explique, j'ais une station météo proche de chez moi qui diffuse dans une page web les données météo de la journée sous cette forme

Code : Tout sélectionner

 
02:00 30/08/2008#14#88#11##0#080#1018######12#>10#E##16#
Sachant que chaque données entre le symbole dièze est une données bien présise.

Exemple:
La donnée 02:00 30/08/2008 est la n°1 (c la date).

La donnée 14 est la N° 2 ( c la Température)
etc, etc......

ses données change tous les jours mais garde toujours leur position dans cette ligne, la date restera toujours en première position, la température toujours en 2ème ....

Le symbole dièze indique simplement une séparation entre les données pour savoir en quelle position elles se trouvent.

Moi ce que je cherche à faire , c'est séparrer chaque données pour les afficher chaqune dans un stringGadget qui leurs appartient. donc en tous 15 StringGadget sur 18 car 3 positions de données se serve à rien

Voici la liste des positions et à quoi correspond chaque positions.

Code : Tout sélectionner

Les données fournies sont dans l'ordre suivantes :

1. Heure et date au format UTC ou locale 
2. Température (°C) 
3. Humidité (%) 
4. Vitesse vent (km/h) 
5. Rien 
6. Vitesse rafales vent (km/h) 
7. Direction vent (en °) 
8. Pression relative (hpa) 
9. Précipitations sur 24h (mm) 
10. Précipitations en cours (mm) 
11. Rien 
12. Rien 
13. Précipitations sur 6h (mm) 
14. Point rosée (°C) 
15. Visibilité (km) 
16. Direction vent 
17. Phénomène(s) observé(s) à la station (pluie, orage, neige, brume ...) 
18. Humidex 
Si vous voullez m'aider il vous suffit de crée une simple page *.html avec comme unique code 02:00 30/08/2008#14#88#11##0#080#1018######12#>10#E##16# il ne faut mettre aucune balise même pas <html></html>.

De mon coté je récupère ses données avec cette commande que je met dans une variable.

Code : Tout sélectionner

Resultat$ = GetGadgetItemText(#WebGadget1,#PB_Web_HtmlCode)
selement je ne c pas comment traiter cette variable ensuite pour pouvoir séparrer mes données pour ensuite les faire afficher dans mes 15 StringGadget. Merci pour votre aide.

Publié : dim. 31/août/2008 18:03
par tmyke
Je ne suis pas un pro des chaines de char, mais dans la doc, il y a une instruction très utile pour ce genre
de situation (StringField), ce qui peut amener à un code dans le genre, écrit vite fait, si cela peut t'aider:

Code : Tout sélectionner

text$ = "02:00 30/08/2008#14#88#11##0#080#1018######12#>10#E##16# "

For k=1 To Len(text$)
  a$= StringField(text$, k, "#")
  If Len(a$)
    Debug a$
  EndIf
Next

Publié : dim. 31/août/2008 18:13
par MetalOS
Désoler j'avais oublier de le mettre dans mon poste. C ce que j'utilise déja dans mon code mais comment ensuite récupérer ligne par ligne ces données pour ensuite les enregistrer dans des variables différentes.

Publié : dim. 31/août/2008 18:20
par Backup
MetalOS a écrit :Désoler j'avais oublier de le mettre dans mon poste. C ce que j'utilise déja dans mon code mais comment ensuite récupérer ligne par ligne ces données pour ensuite les enregistrer dans des variables différentes.
il t'a pourtant répondu !! :?

ça c'est pas pour decorer !! :lol:

Code : Tout sélectionner

If Len(a$)
    Debug a$
  EndIf 
il recupere les donnée entre les Dieses
et s'il la longueur est nul cela signifie que plusieurs dieses se suivent !!


c'est pour ça que le debug n'affiche que ce qui existe !! :)
donc lorsque le debug affiche, c'est que quelque chose a ete récupéré :)

tu pourrai d'ailleurs utiliser un tableau (ou une liste chainée,ou une structure) pour recuperer tes valeurs

Code : Tout sélectionner

If Len(a$)
    Debug a$
i=i+1
tabl$(i)=a$
  EndIf 

Publié : dim. 31/août/2008 19:14
par MetalOS
Désoler je ne comprend pas vraiment ce qui est liste chainé ou structure ou tableau j'ais toujours u du mal la dessus, j'ais du relire 200 fois la doc ca veut toujour pas rentrer. :oops: :oops:

Je ne voie vraiment pas comment avec un tableau ou une structure peut découper ma variable a$ en 15 morceaux pour y extraire chaque données.

Pourriez vous m'expliquer si ca ne vous dérrange pas car la je suis vraiment largué. :( :( :( :(

Publié : lun. 01/sept./2008 2:39
par MetalOS
Help :cry: :cry: :cry: :cry: :cry: :cry:

Publié : lun. 01/sept./2008 4:10
par Ouaf-Ouaf
Les tableaux, liste chainées ou structures ne decoupent pas ta variable.

Ce sont des moyens d'enregistrer tes infos et de les rappeler dans une boucle par exemple.

Au lieu d'ecrire

Drawtext(20,20, Temperature$ )
Drawtext(20,40, Humidité$ )
Drawtext(20,60, Vent$ )

Ect...

Tu ecriras

For A = 1 to 3

Drawtext( 20, 20*A, Tableau(A)

Next A


Les listechainées peuvent te permettre d'ecrire un tableau dont tu ne peux pas prevoire la taille à l'avance.

Les structures, d'ajouter des dimensions à ton tableau et/ou choisir pour chacune un type.

L'aide de PureBasic n'est pas trés explicite, tu devrais regarder les tutos qui se trouvent sur ce forum.

Publié : lun. 01/sept./2008 9:03
par Atomo

Code : Tout sélectionner

Resultat.s = "02:00 30/08/2008#14#88#11##0#080#1018######12#>10#E##16#"

Dim meteo.s(14) ;création du tableau à 15 éléments

For x=1 To 18 ;(nombre de #)
  info.s = StringField(Resultat, x, "#") ;découpage de la chaîne Resultat.s
  If x <> 5 And x <> 11 And x <> 12 ;on ne prend pas en compte les éléments 5, 11 et 12
    meteo(y) = info ;remplissage du tableau avec info.s
    y+1
  EndIf
Next x

Debug "date = "+meteo(0) 
Debug "Température (°C) = "+meteo(1)
Debug "Humidité (%) = "+meteo(2)
Debug "Vitesse vent (km/h) = "+meteo(3)
Ce code utilise un tableau de 15 éléments (le 0 compte c'est pour ça qu'il y a marqué meteo.s(14))
Si tu veux ressortir la 1ère valeur du tableau tu marquera : debug meteo(0) ou debug meteo(9) pour la 10ème.

Publié : lun. 01/sept./2008 9:59
par Kayne
MetalOS a écrit :Désoler je ne comprend pas vraiment ce qui est liste chainé ou structure ou tableau j'ais toujours u du mal la dessus, j'ais du relire 200 fois la doc ca veut toujour pas rentrer. :oops: :oops:

Je ne voie vraiment pas comment avec un tableau ou une structure peut découper ma variable a$ en 15 morceaux pour y extraire chaque données.

Pourriez vous m'expliquer si ca ne vous dérrange pas car la je suis vraiment largué. :( :( :( :(
A mais il y a des tutos qui existent la dessus ...
ici

EDIT: si jamais c'est toujours aussi confus dans ta tête je ré expliquerais ici tout ca.

Publié : lun. 01/sept./2008 11:29
par case
moi a mon avis il faudrait un tuto a kayne sur le bouton éditer du forum.
3 post identiques pour arriver a poster un lien...

moi je dis ça, je dis rien ^^

Publié : lun. 01/sept./2008 12:19
par tmyke
Bon, si tu n'es pas rompu au manipulations des tableaux MetalOS, effectivement, je pense qu'il faut
que tu commences par bien appréhender ces concepts, car la maitrise des différents type de
données en prog est une des bases indispensable. Les tableaux en font partie. Comme dit au dessus,
il existe de bon tuto ici qui devrait te permettre de mieux comprendre les choses.

Pour ce qui est de ton projet d'application, voici un petit code rapide qui rempli des StringGadgets
avec les données qui sont extraites. C'est un code simple et basic, à toi de le décortiquer et d'en
comprendre les mécanismes (simples). En suite, je pense que tu n'auras aucun mal à l'adapter à tes
besoins et à mieux l'optimiser...

Code : Tout sélectionner

; un petit tableau global
Global Dim chaines$(12) ; 13 entrées possibles (de 0 à 12), correspondant aux nombre
                         ; de stringGadgets définis.


;-----------------------------------
; zone de definition pour les gadgets,
; fait avec Visual Designer:
;-----------------------------------
;- Window Constants
Enumeration
  #Window_0
EndEnumeration
;- Gadget Constants
Enumeration
  #String_0
  #String_1
  #String_2
  #String_3
  #String_4
  #String_5
  #String_6
  #String_7
  #String_8
  #String_9
  #String_10
  #String_11
  #String_12
  #Text_0
  #Text_1
  #Text_2
  #Text_3
  #Text_4
  #Text_5
  #Text_6
  #Text_7
  #Text_8
  #Text_9
  #Text_10
  #Text_11
  #Text_12
EndEnumeration

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 361, 471, "Meteo Test ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      StringGadget(#String_0, 60, 40, 100, 20, "")
      StringGadget(#String_1, 60, 70, 100, 20, "")
      StringGadget(#String_2, 60, 100, 100, 20, "")
      StringGadget(#String_3, 60, 130, 100, 20, "")
      StringGadget(#String_4, 60, 160, 100, 20, "")
      StringGadget(#String_5, 60, 190, 100, 20, "")
      StringGadget(#String_6, 60, 220, 100, 20, "")
      StringGadget(#String_7, 60, 250, 100, 20, "")
      StringGadget(#String_8, 60, 280, 100, 20, "")
      StringGadget(#String_9, 60, 310, 100, 20, "")
      StringGadget(#String_10, 60, 340, 100, 20, "")
      StringGadget(#String_11, 60, 370, 100, 20, "")
      StringGadget(#String_12, 60, 400, 100, 20, "")
      TextGadget(#Text_0, 170, 40, 70, 20, "Texte1 ")
      TextGadget(#Text_1, 170, 70, 70, 20, "Texte2 ")
      TextGadget(#Text_2, 170, 100, 70, 20, "Texte3 ")
      TextGadget(#Text_3, 170, 130, 70, 20, "Texte4 ")
      TextGadget(#Text_4, 170, 160, 70, 20, "Texte5 ")
      TextGadget(#Text_5, 170, 190, 70, 20, "Texte6 ")
      TextGadget(#Text_6, 170, 220, 70, 20, "Texte7 ")
      TextGadget(#Text_7, 170, 250, 70, 20, "Texte8 ")
      TextGadget(#Text_8, 170, 280, 70, 20, "Texte9 ")
      TextGadget(#Text_9, 170, 310, 70, 20, "TexteA ")
      TextGadget(#Text_10, 170, 340, 70, 20, "TexteB ")
      TextGadget(#Text_11, 170, 370, 70, 20, "TexteC ")
      TextGadget(#Text_12, 170, 400, 70, 20, "TexteD ")
    EndIf
  EndIf
EndProcedure


;-----------------------------------------
; extraction des fameuse chaine, reprise
; du code que je donnais plus haut:chaines
;-----------------------------------------
text$ = "02:00 30/08/2008#14#88#11##0#080#1018######12#>10#E##16# "

num_chaines = 0

For k=1 To Len(text$)
  a$= StringField(text$, k, "#")
  If Len(a$)
    chaines$(num_chaines) = a$
    num_chaines + 1 
    ; test de bornes très rudimentaire
    If num_chaines > 12
      num_chaines=0
    EndIf
  EndIf
Next


;--------------------------------------
; ouverture de la fenetre
;--------------------------------------
Open_Window_0()
;-----------------------------------------
; en suite on alimente les StringGadgets
; disponibles avec notre petit tableau
;-----------------------------------------
For k= #String_0 To #String_0+12
  SetGadgetText(k, chaines$(k))
Next

;--------------------------------------
; attente
;--------------------------------------
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

Publié : lun. 01/sept./2008 17:24
par Kayne
case a écrit :moi a mon avis il faudrait un tuto a kayne sur le bouton éditer du forum.
3 post identiques pour arriver a poster un lien...

moi je dis ça, je dis rien ^^
Oh merde j'ai pas fait gaffe c'est quand je devais faire précédent pour éditer je repostais a chaque fois :? dsl faut supprimé les deux premiers.

Publié : lun. 01/sept./2008 18:11
par MetalOS
Un grand merci les mecs, j'en demandais pas autant. Mais merci à vous, si après ca je ne comprend pas les structure tableau ou liste chainées........ :D Ben je vient passer un week-end chez vous pour apprendre :lol: :lol: :lol: :lol: . Merci.

Publié : ven. 05/sept./2008 19:00
par GeBonet
; Une réponse aussi possible à :
;

Code : Tout sélectionner

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
;  *** Décodage d'une CHAINE composée de DONNEES séparés par un signe connu **** 
; 
;  Utilisation de Data et d'un tableau ) deux dimensions : 1 dimension pour les commentaires 
;                                                                                 2  et l'autre pour les données extraite de la chaine  
;  ------------------------------------------------------------------------
;    
Chaine$ = "02:00 30/08/2008#14#88#11##0#080#1018######12#>10#E##16#."	; La chaine transmise (attention ici un point après le dernier séparateur)
ChaineATrouver$="#"																					    ; Le séparateur            *******************************************************
;
;  Possibilité à partir d'ici de mettre cette partie en SOUS ROUTINE ou en Procédure, si l'on doit utiiser souvent la séquence de décodage ..... 
;  ----------------------------------------------------------------------------
;
Nb_Champs = CountString(Chaine$, ChaineATrouver$)										; Recheche de "Nombre de champs" 
;        ============================= 
If Right(Chaine$,1)<>ChaineATrouver$ : Nb_Champs=Nb_Champs+1: EndIf  	; Il y a t'il un CHAMP après le dernier séparateur à la fin.... ??? 
Dim TableMeteo$(2,Nb_Champs)																	; Dimensionnement du tableau 
;
Debug "Il y a "+Str(Nb_Champs)+" donnés séparées par "+ChaineATrouver$
Debug "-------------------------------------------------------------------------------"
; 
For k=1 To Nb_Champs

                  Read Mot$
		  If Mot$="Supplément" 
		  	  	Preced$=TableMeteo$(2,k-1): Position = FindString(Chaine$, Preced$, 1) :Adroite=Len(Chaine$)-(Position+Len(Preced$))
		  	  	TableMeteo$(2,k)=Right(Chaine$, Adroite)
		  Else
		  		TableMeteo$(2,k)=StringField(Chaine$, k, ChaineATrouver$)
		  EndIf			;              ==============================
		  TableMeteo$(1,k)=Mot$
		  ;        
		  Debug Str(k)+"-"+TableMeteo$(1,k)+" => "+TableMeteo$(2,k)
		  
Next k	  

DataSection
    Meteo:

	Data.s "Heure et date au format UTC ou locale","Température (°C)","Humidité (%)","Vitesse vent (km/h)","Rien","Vitesse rafales vent (km/h)"
	Data.s "Direction vent (en °)","Pression relative (hpa)","Précipitations sur 24h (mm)","Précipitations en cours (mm)","Rien","Rien"
	Data.s "Précipitations sur 6h (mm)","Point rosée (°C)","Visibilité (km)","Direction vent","Phénomène(s) observé(s) à la station (pluie, orage, neige, brume ...)"
	Data.s  "Humidex","Supplément"

EndDataSection
a=a+1
End