Pb de convertion string en double

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Pb de convertion string en double

Message par Stéphane »

Bonjour

J'ai un tableau de structure que je declare ainsi

Code : Tout sélectionner

Structure Barre
  Date.s
  Open.d
  High.d
  Low.d
  Close.d
  Pic.i  
EndStructure

Global Dim Barres.Barre(1)
Je lis un fichier csv, compte le nombre de lignes, redimensionne le tableau puis fait une
nouvelle boucle de lecture et separe chaque colonne de chaque ligne pour renseigner mon tableau comme ceci (Je sais je remplis volontairement à partir de l index 1)

Code : Tout sélectionner

NoLignes.i = 1 
  If ReadFile(0, Fichier)   
    While Eof(0) = 0      
      sTemp= ReadString(0)
      Barres(NoLignes)\Date = StringField(sTemp,1,",")
      Barres(NoLignes)\open = ValD(StringField(sTemp,2,","))
      Barres(NoLignes)\low = ValD(StringField(sTemp,3,","))
      Barres(NoLignes)\High = ValD(StringField(sTemp,4,","))
      Barres(NoLignes)\Close = ValD(StringField(sTemp,5,","))
      NoLignes+1     
    Wend
    CloseFile(0)
  EndIf
  
Mon pb est que, lors de la convertion avec ValD() les decimales ne sont pas prise en compte alors même que la Structure Declare les champs en double et que je convertis au moment de la lecture le string en double.

Qu'ai-je raté ?

Merci de m éclairer pke j ai bien lu la doc et la fonction que j utilise devrait être la bonne, les types sont déclarés correctement.
Précision, je ne sais pas si c est utile, mais le séparateur décimal dans mon fichier est le point.
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Pb de convertion string en double

Message par Naheulf »

Pour moi, à priori ça devrais fonctionner.

Peut-tu nous donner le fichier csv concerné ?
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Re: Pb de convertion string en double

Message par Stéphane »

Merci.
Je précise que je rencontre ce pb avec tous mes csv. Il sont extrait d un logiciel boursier, cela pourrait il provenir d un pb d encodage ou de je ne sais quoi du dit logiciel ?
J ai pas trouvé comment le joindre alors quelques lignes :

Code : Tout sélectionner

2013-09-30,8582.1,8585.7,8568.7,8585.7
2013-10-01,8619.2,8691.2,8613.4,8686.2
2013-10-02,8652.0,8670.9,8585.3,8628.1
2013-10-03,8618.4,8643.4,8590.6,8596.3
2013-10-04,8584.3,8637.7,8573.1,8623.1
2013-10-07,8526.6,8604.4,8516.3,8592.1
2013-10-08,8591.5,8606.1,8553.6,8558.0
2013-10-09,8541.0,8588.7,8502.7,8513.6
2013-10-10,8592.1,8691.6,8587.9,8685.9
2013-10-11,8708.6,8728.9,8697.1,8723.9
2013-10-14,8688.4,8723.7,8676.4,8702.8
2013-10-15,8765.3,8795.9,8764.2,8795.9
2013-10-16,8804.4,8807.5,8788.3,8790.8
2013-10-17,8798.7,8812.5,8769.1,8812.0
2013-10-18,8849.9,8851.2,8804.8,8843.1
2013-10-21,8828.5,8876.1,8827.5,8867.2
2013-10-22,8867.2,8987.6,8850.6,8947.5
2013-10-23,8947.5,8947.5,8897.5,8919.9
2013-10-24,8919.9,8976.2,8919.9,8960.0
2013-10-25,8960.6,8987.0,8951.3,8977.6
2013-10-28,8984.5,8999.8,8951.3,8972.8
2013-10-29,8972.8,9039.0,8962.0,9020.6
2013-10-30,9021.2,9070.3,8952.9,8962.5
2013-10-31,8961.9,9052.3,8952.1,9022.8
2013-11-01,9023.4,9046.3,8992.3,9026.3
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Pb de convertion string en double

Message par Ollivier »

Tu vires les points avec RemoveString() et tu travailles en 1/10ièmes.

Exemple : 1ère valeur = 85821 dixièmes

Tu feras gaffe, l'interdiction sur les Shorts a été reconduite.
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Pb de convertion string en double

Message par Naheulf »

Je ne reproduis pas le problème.
J’ai mis ton tableau de données dans un fichier « data.csv »
J’ai recollé ton code et ai ajouté quelques lignes de débogage.

Code : Tout sélectionner

Structure Barre
	Date.s
	Open.d
	High.d
	Low.d
	Close.d
	Pic.i 
EndStructure

Global Dim Barres.Barre(25)

Fichier.s = OpenFileRequester("Fichier CSV", GetCurrentDirectory()+"data.csv", "", 0)
NoLignes.i = 1
If ReadFile(0, Fichier)
	While Eof(0) = 0
		sTemp.s= ReadString(0)
		Barres(NoLignes)\Date = StringField(sTemp,1,",")
		Barres(NoLignes)\open = ValD(StringField(sTemp,2,","))
		Barres(NoLignes)\low = ValD(StringField(sTemp,3,","))
		Barres(NoLignes)\High = ValD(StringField(sTemp,4,","))
		Barres(NoLignes)\Close = ValD(StringField(sTemp,5,","))
		
		Debug "Ligne "+NoLignes+" :"
		Debug #TAB$+Barres(NoLignes)\Date
		Debug #TAB$+Barres(NoLignes)\open
		Debug #TAB$+Barres(NoLignes)\low
		Debug #TAB$+Barres(NoLignes)\High
		Debug #TAB$+Barres(NoLignes)\Close
		
		NoLignes+1
	Wend
	CloseFile(0)
EndIf
Et voilà la sortie de débogage que j’ai :

Code : Tout sélectionner

Ligne 1 :
	2013-09-30
	8582.1
	8585.7
	8568.7
	8585.7
Ligne 2 :
	2013-10-01
	8619.2
	8691.2
	8613.4
	8686.2
Ligne 3 :
	2013-10-02
	8652
	8670.9
	8585.3
	8628.1
Ligne 4 :
	2013-10-03
	8618.4
	8643.4
	8590.6
	8596.3
Ligne 5 :
	2013-10-04
	8584.3
	8637.7
	8573.1
	8623.1
Ligne 6 :
	2013-10-07
	8526.6
	8604.4
	8516.3
	8592.1
Ligne 7 :
	2013-10-08
	8591.5
	8606.1
	8553.6
	8558
Ligne 8 :
	2013-10-09
	8541
	8588.7
	8502.7
	8513.6
Ligne 9 :
	2013-10-10
	8592.1
	8691.6
	8587.9
	8685.9
Ligne 10 :
	2013-10-11
	8708.6
	8728.9
	8697.1
	8723.9
Ligne 11 :
	2013-10-14
	8688.4
	8723.7
	8676.4
	8702.8
Ligne 12 :
	2013-10-15
	8765.3
	8795.9
	8764.2
	8795.9
Ligne 13 :
	2013-10-16
	8804.4
	8807.5
	8788.3
	8790.8
Ligne 14 :
	2013-10-17
	8798.7
	8812.5
	8769.1
	8812
Ligne 15 :
	2013-10-18
	8849.9
	8851.2
	8804.8
	8843.1
Ligne 16 :
	2013-10-21
	8828.5
	8876.1
	8827.5
	8867.2
Ligne 17 :
	2013-10-22
	8867.2
	8987.6
	8850.6
	8947.5
Ligne 18 :
	2013-10-23
	8947.5
	8947.5
	8897.5
	8919.9
Ligne 19 :
	2013-10-24
	8919.9
	8976.2
	8919.9
	8960
Ligne 20 :
	2013-10-25
	8960.6
	8987
	8951.3
	8977.6
Ligne 21 :
	2013-10-28
	8984.5
	8999.8
	8951.3
	8972.8
Ligne 22 :
	2013-10-29
	8972.8
	9039
	8962
	9020.6
Ligne 23 :
	2013-10-30
	9021.2
	9070.3
	8952.9
	8962.5
Ligne 24 :
	2013-10-31
	8961.9
	9052.3
	8952.1
	9022.8
Ligne 25 :
	2013-11-01
	9023.4
	9046.3
	8992.3
	9026.3
Note : Le seul comportement étrange que j’ai eu fut avec la première date mais c’était lié au fait que j’avais enregistré le fichier CSV en UTF8 avec BOM.
Note 2 : J'utilise PB 5.72 (x64) sur windows 8.1 (au cas ou ça ai un lien)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Pb de convertion string en double

Message par Ar-S »

Je pencherai pour un soucis d'encodage aussi en sortie de ton prog boursier.
Ouvre un csv avec notpad++ par exemple et regarde en quoi il est encodé.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Re: Pb de convertion string en double

Message par Stéphane »

Merci

J'ai remplacé mon code par le tien et tout fonctionne indépendamment du fichier (qui était bien en UTF-8).
J avais essayé mon code avec d autre cours dont les valeurs étaient toutes <1 et j avais systématiquement 1 à l'affichage.

Par contre à quoi correspond #TAB$ dans ton code. J ai fait F1 dessus et sur Debug pour savoir si cela y était spécialement associé mais n ai rien trouvé.
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Pb de convertion string en double

Message par Naheulf »

Effectivement ça n’apparaît pas dans l’aide (O_o). La constante "#TAB$" est une des constantes prédéfinie dans PureBasic. Elle contient une chaîne de caractère composé du caractère tabulation. C’est l’équivalent de « Chr(9) ». Je trouve cependant que c’est BEAUCOUP plus explicite.

En fait, quasiment tous les caractères spéciaux ASCII ont leur petite constante. Et, quasiment à chaque fois, il y a même deux constantes :
— La première, sans "$" à la fin, contient la valeur numérique de la constante.
— La seconde, avec le "$" à la fin, contient le caractère sous forme de chaîne de caractère.

Remarques :
— Ne PAS confondre les constantes #NUL, #Null et #Null$.
— La constante #NUL représente le caractère NUL.
— La constante #Null représente un pointeur null.
— La constante #Null$ représente une chaine de caractère non initialisé.
— La constante #NUL$ n’existe pas. Cela n’aurait pas de sens car #NUL représente une fin de chaîne. On aurait donc une chaine qui se termine avant la fin. Ce serait aussi dangereux qu’une tyrolienne dont le câble s’arrêterait en plein milieu !
— La constante #Empty$ est l’équivalent d’une chaîne vide ("")
— La constante #CRLF$ représente un retour à la ligne sous Windows. C’est une chaîne composée des caractères #CR et #LF. (Ou la concaténation de #CR$ et #LF$, c’est comme tu veux  :P )
Stéphane
Messages : 29
Inscription : sam. 18/avr./2020 15:17

Re: Pb de convertion string en double

Message par Stéphane »

Merci pour ces précisions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Pb de convertion string en double

Message par Ar-S »

J'ai découvert #TAB$ aussi ! (faut dire j'en ai jamais eu besoin)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Pb de convertion string en double

Message par Ollivier »

Ollivier a écrit :Tu feras gaffe, l'interdiction sur les Shorts a été reconduite.
Voilàm... Le repas va êt' prêt !

Si tu veux un petit test de présentation pour les bougies... En tout cas, y'a la musique !
Répondre