Page 1 sur 3
[R] Problème de remplissage array
Posté : mer. 21 août 2013 01:51
par Hugues
Bonjour,
Je voudrais tracer une courbe avec des données contenues dans un fichier sur 2 colonnes (séparée par un ";").
J'arrive à décortiquer le fichier grâce à la fonction "_StringToArray2D".
Voici le contenu de mon fichier:
► Afficher le texte
'FILE VERSION: x.x'
'tutu' 'toto' 'Yesterday les Beatles'
'12.06.2013 20:48:48'
'SW Version =' '3.5.28'
'mm';'kN'
0.00; 0.89
0.02; 1.09
0.03; 1.28
0.04; 1.52
0.05; 1.74
0.07; 1.91
0.08; 2.04
0.09; 2.14
0.10; 2.22
0.10; 2.29
0.11; 2.36
0.12; 2.42
0.12; 2.46
0.12; 2.50
0.13; 2.54
0.13; 2.56
0.14; 2.58
0.14; 2.60
0.15; 2.61
0.15; 2.61
0.16; 2.61
0.16; 2.63
0.17; 2.63
0.17; 2.63
0.18; 2.64
0.18; 2.65
0.19; 2.65
0.19; 2.65
0.19; 2.65
0.20; 2.66
0.20; 2.66
0.21; 2.65
Pour faire simple, je veux récupérer les données 'mm' et 'KN' pour faire une courbe (mm étant abscisses, et KN ordonnées) avec GDI...
Ci joint mon code sans la partie GDI puisque je n'arrive pas à récuperer les données...
Merci par avance pour votre aide.
Code : Tout sélectionner
[spoiler=]
#Include <File.au3>
#Include <Array.au3>
#Include <ArrayEx.au3>
$File = FileRead("Fichier.3")
Global $CountLines = _FileCountLines("Fichier.3")
Global $aArrayTempValue, $ligne, $aResult, $StartLine
$aString = _StringToArray2D($File, @CRLF, ";", 1)
$ChaineRecherchee = "'mm'"
$aResult = _ArrayFindAll($aString, $ChaineRecherchee)
$StartLine = $aResult[0] + 1 ;J'incrémente de 1 pour partir sur la bonne ligne....
$TotalLine = $CountLines - $aResult[0] ;Je détermine le nombre de ligne pour ma courbe en excluant les lignes < à la ligne $aResult...
Local $aPoints[$TotalLine][2] ;Je dimensionne mon tableau en fonction des valeurs trouvées...
For $h = $StartLine To UBound($CountLines)
$aPoints[$h][0] = $aString[$h][0]
$aPoints[$h][1] = $aString[$h][1]
Next
_arraydisplay($aPoints) ;MAIS MON TABLEAU EST VIDE....[/spoiler]
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 10:28
par mikell
Code : Tout sélectionner
#Include <Array.au3>
$file = FileRead("test.txt")
$res = StringRegExp($file, '([\d.]+;\h*[\d.]+)', 3)
Global $array[UBound($res)][2]
For $i = 0 to UBound($res)-1
$split = StringSplit($res[$i], "; ", 3)
$array[$i][0] = $split[0]
$array[$i][1] = $split[1]
Next
_ArrayDisplay($array)
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 11:08
par alex1205
Salut Hugues,
Voilà un script que j'ai fait à l'arrache :
Code : Tout sélectionner
$File = FileRead("Nouveau document texte.txt")
;~ MsgBox(0, "", $File)
$array = StringRegExp($File, "\d.\d{2}; \d.\d{2}", 3)
;~ _ArrayDisplay($array)
Dim $aResult[999][999]
For $i = 0 To UBound($array) - 1
$aResult[$i][0] = _ArrayGetString(StringRegExp($array[$i], "\d.\d{2}", 3), 0)
$aResult[$i][1] = _ArrayGetString(StringRegExp($array[$i], "\d.\d{2}", 3), 1)
Next
;~ Redim $aResult[35][2]
_ArrayDisplay($aResult)
Func _ArrayGetString($array, $i)
Return $array[$i]
EndFunc ;==>_ArrayGetString
C'est la première fois que j'utilise les regex et c'était un désastre

Normalement ça doit marcher. (alors il est bien mon regex?

)
Alex1205
EDIT : Ah bah mince j'ai pas vu la réponse de mikell, je suis déçu

j'ai cru être le premier !
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 14:43
par GaRydelaMer
Bonjour
je t'ai presque tout mis sous forme de fonction se sera plus simple pour implémenter ta couche GDI.
► Afficher le texte
Code : Tout sélectionner
#include <Array.au3>
Local $arr = _ParseFile("zzz.txt")
_ArrayDisplay($arr)
Func _ParseFile($File)
Local $aReturn[1][2] = [[0, 0]]
If Not FileExists($File) Then Return SetError(1, 1, $aReturn)
Local $Pattern = "([0-9\.,]+);\s*([0-9\.,]+)" ;;; Ici je capture les 2 groupes de valeur les nombres avec un "." (qui au passage doit être échappée \.) ou "," comme séparateur de décimale
Local $aMatches = StringRegExp(FileRead($File), $Pattern, 3)
If Not IsArray($aMatches) Then Return SetError(1, 1, $aReturn)
_ArrayDisplay($aMatches)
Dim $aReturn[UBound($aMatches) / 2][2]
Local $iCount = 0
For $i = 0 To UBound($aMatches) - 1 Step 2
_TraceCourbe($aMatches[$i], $aMatches[$i + 1])
$aReturn[$iCount][0] = "x: " & $aMatches[$i]
$aReturn[$iCount][1] = "y: " & $aMatches[$i + 1]
$iCount += 1
Next
Return $aReturn
EndFunc ;==>_ParseFile
Func _TraceCourbe($x, $y)
ConsoleWrite(StringFormat("TraceCourbe X: %.02f, Y: %.2f\n", $x, $y))
EndFunc ;==>_TraceCourbe
@Mikell tu y étais presque pourquoi avec ta regexp tu captures pas les 2 valeurs d'un coup ?
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 15:04
par mikell
alex1205 a écrit :alors il est bien mon regex?
Il faut anticiper qu'une ligne en fin de fichier peut éventuellement être
et dans ce cas ton regex ne marchera plus
@gary
par timidité probablement
En fait c'est ce que j'avais fait d'abord, et puis j'ai choisi l'option du tri des lignes pour la sécurité et une meilleure compréhension du code (il y a pas mal de solutions regex possibles pour traiter ce fichier)
Et pas besoin d'échapper le point dans un set

Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 15:05
par alex1205
@Mikell : en fait j'avais fait deux scripts, le premier c'est celui que j'ai donné et le deuxième fonctionnait :
Code : Tout sélectionner
#include <Array.au3>
$File = FileRead("Nouveau document texte.txt")
Dim $aResult[999][999]
$aEveryLine = StringSplit($File, @CRLF)
For $i = 1 To $aEveryLine[0]
If UBound(StringSplit($aEveryLine[$i], ";")) = 3 Then
$aResult[$i][0] = 2
$aResult[$i][1] = _ArrayGetString(StringSplit($aEveryLine[$i], ";"), 1)
$aResult[$i][2] = _ArrayGetString(StringSplit($aEveryLine[$i], ";"), 2)
EndIf
Next
_ArrayDisplay($aResult)
Func _ArrayGetString($array, $i)
Return $array[$i]
EndFunc ;==>_ArrayGetString
Ca aurait marché ?
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 15:13
par mikell
Pas top...
- tu récupères la ligne 'mm';'kN' (indésirable)
- ton array démarre à l'index 11 et une ligne/2 est vide
- la colonne 0 est inutile (voir dans l'aide les flags pour StringSplit)
- tu ne redimensionnes pas ton array en fin de traitement
- pour la 2ème valeur, tu récupères aussi l'espace qui est avant la valeur (utiliser StringStripWS, ou mettre "; " comme délimiteur dans StringSplit)
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 15:18
par alex1205
Ah... au moins j'ai essayé
J'en aurais au moins tiré une leçon
Alex1205
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 15:31
par GaRydelaMer
@Mikell, toi timide je le note pour plus tard....
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 19:11
par Hugues
Merci à tous de vous êtes penchés sur mon problème
La solution de GaRydelaMer me plait bien! Je l'essai de suite
Re: [..] Problème de remplissage array
Posté : mer. 21 août 2013 22:49
par jguinch
Salut.
J'arrive après la guerre (encore).
Je voulais proposer un code qui permettrait de gérer les nombres entiers/décimaux et positifs/négatifs... car on ne sait pas si les valeurs mm et kN seront toujours au même format...
Il y a certainement plus propre, mais l'idée est là.
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
Local $aExtract, $n = 0
$content = FileRead("data.txt")
$aExtract = StringRegExp($content, "(-?\d+(?:[.,]\d*)?\h*);\h*(-?\d+(?:[.,]\d*)?)", 3, StringInStr($content, "'mm';'kN'") )
If NOT IsArray($aExtract) OR IsFloat(Ubound($aExtract) / 2) Then Exit MsgBox(16, "", "Error")
Local $aDataXY[UBound($aExtract) / 2][2]
For $i = 0 To UBound($aExtract) - 1 Step 2
$aDataXY[$n][0] = $aExtract[$i]
$aDataXY[$n][1] = $aExtract[$i + 1]
$n += 1
Next
_ArrayDisplay($aDataXY, "Col0 = X ; Col1 = Y")
Re: [..] Problème de remplissage array
Posté : jeu. 22 août 2013 11:55
par Hugues
Salut jguinch,
C'est pas grave d'arriver après la guerre!

Ça me convient parfaitement!
Maintenant faut que je traite tout ca avec GDI et là c'est le drame...

Re: [..] Problème de remplissage array
Posté : jeu. 22 août 2013 20:39
par jguinch
Tu es obligé de passer par GDI ? Tu ne peux pas utiliser les fonctions graphiques de base (GUICtrlCreateGraphic) ?
Re: [..] Problème de remplissage array
Posté : ven. 23 août 2013 12:11
par Hugues
Justement je sais pas... Mes connaissances étant très limitées, je ne sais pas vers quoi me tourner...
Ce qui m’intéresse c'est une solution simple et efficace
Mikell m'a fait une superbe programme
http://www.autoitscript.fr/forum/viewto ... =3&t=11244 sur un autre sujet.
J'essaie de m'en inspirer bien qu'ici ma courbe sera fixe.
Donc pour gagner du temps et que chacun puisse m'orienter voici ce que j'aimerai faire:
-Lire les données pour tracer ma courbe -> Ok
-Définir les échelles de mes axes X et Y,
-Tracer ma courbe,
-Récupérer les valeurs de chaque point via un "mouseover" sur la courbe...
J'ai encore gros gros de boulot...
Re: [..] Problème de remplissage array
Posté : ven. 23 août 2013 16:16
par mikell
Simple et efficace = GUICtrlCreateGraphic
Le plus tordu c'est le calcul des échelles et le fait que les valeurs "y" s'inversent dans le tracé de la courbe
Sinon pour le mouseover on peut faire comme ça par exemple
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
Opt("MouseCoordMode", 2)
Dim $a[101][2]
For $i = 0 to 100
$a[$i][0] = $i*5 ; 0-500
$a[$i][1] = 50 + Random(-20, 30, 1)
Next
$hGUI = GUICreate("Graph", 530, 200)
$g = GUICtrlCreateGraphic(10, 10, 510, 90)
GUICtrlSetBkColor(-1, 0xeeeeff)
GUICtrlSetColor(-1, 0)
GUICtrlSetGraphic($g, $GUI_GR_MOVE, 0, 50)
For $i = 0 to UBound($a)-1
GUICtrlSetGraphic($g, $GUI_GR_COLOR, 0xff)
GUICtrlSetGraphic($g, $GUI_GR_LINE, $a[$i][0], $a[$i][1])
Next
GUISetState()
Do
$b = GUIGetCursorInfo($hGUI)
If $b[4] = $g Then
$pos = MouseGetPos()
For $i = 0 to 100
If $pos[0]-10 > $a[$i][0]-2 and $pos[0]-10 < $a[$i][0]+2 Then
ToolTip($a[$i][0]/5 &"x"& $a[$i][1])
EndIf
Next
Else
ToolTip("")
EndIf
Sleep(10)
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Re: [..] Problème de remplissage array
Posté : lun. 26 août 2013 14:00
par Hugues
Merci Mikell,
Mais je dois être vraiment bête car je n'arrive pas à combiner ces deux bouts de code...
Le premier me donne parfaitement mes coordonnées x et y pour ma courbe, et la seconde de Mikell pour tracer... mais je n'y arrive pas...
► Afficher le texte
Code : Tout sélectionner
#Include <Array.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
Local $aExtract, $n = 0
$content = FileRead("MonFichier")
$aExtract = StringRegExp($content, "(-?\d+(?:[.,]\d*)?\h*);\h*(-?\d+(?:[.,]\d*)?)", 3, StringInStr($content, "'mm';'kN'") )
If NOT IsArray($aExtract) OR IsFloat(Ubound($aExtract) / 2) Then Exit MsgBox(16, "", "Pas de données de traitement")
Local $aDataXY[UBound($aExtract) / 2][2]
For $i = 0 To UBound($aExtract) - 1 Step 2
$aDataXY[$n][0] = StringReplace($aExtract[$i], ".", ",")
$aDataXY[$n][1] = StringReplace($aExtract[$i + 1], ".", ",")
$n += 1
Next
_ArrayDisplay($aDataXY, "Col0: xAxe | Col1: yAxe")
Et le code de Mikell
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
Opt("MouseCoordMode", 2)
Dim $a[101][2]
For $i = 0 to 100
$a[$i][0] = $i*5 ; 0-500
$a[$i][1] = 50 + Random(-20, 30, 1)
Next
$hGUI = GUICreate("Graph", 530, 200)
$g = GUICtrlCreateGraphic(10, 10, 510, 90)
GUICtrlSetBkColor(-1, 0xeeeeff)
GUICtrlSetColor(-1, 0)
GUICtrlSetGraphic($g, $GUI_GR_MOVE, 0, 50)
For $i = 0 to UBound($a)-1
GUICtrlSetGraphic($g, $GUI_GR_COLOR, 0xff)
GUICtrlSetGraphic($g, $GUI_GR_LINE, $a[$i][0], $a[$i][1])
Next
GUISetState()
Do
$b = GUIGetCursorInfo($hGUI)
If $b[4] = $g Then
$pos = MouseGetPos()
For $i = 0 to 100
If $pos[0]-10 > $a[$i][0]-2 and $pos[0]-10 < $a[$i][0]+2 Then
ToolTip($a[$i][0]/5 &"x"& $a[$i][1])
EndIf
Next
Else
ToolTip("")
EndIf
Sleep(10)
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Re: [..] Problème de remplissage array
Posté : lun. 26 août 2013 17:54
par mikell
Franchement tu exagères

c'est quasiment le même truc que le code d'autrefois
M'enfin bon voilà l'idée, sans la mise à l'échelle qui demande quelques règles de 3, faire des coeffs etc j'ai la flemme
ça utilise ton fichier du post n°1
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#Include <Array.au3>
Opt("MouseCoordMode", 2)
$file = FileRead("test.txt")
$res = StringRegExp($file, '([\d.]+;\h*[\d.]+)', 3)
Global $array[UBound($res)][2]
For $i = 0 to UBound($res)-1
$split = StringRegExp($res[$i], '[\d.]+', 3)
$array[$i][0] = $split[0]
$array[$i][1] = $split[1]
Next
;_ArrayDisplay($array)
;=========données pour une mise à l'échelle éventuelle====
$max_x = _ArrayMaxOrMin($array, "max", 1)
$min_x = _ArrayMaxOrMin($array, "min", 1)
$max_y = _ArrayMaxOrMin($array, "max", 2)
$min_y = _ArrayMaxOrMin($array, "min", 2)
msgbox(0,"", "$min_x = " & $min_x &@crlf& _
"$max_x = " & $max_x &@crlf&@crlf& _
"$min_y = " & $min_y &@crlf& _
"$max_y = " & $max_y )
;======================================
$H_grafik = 90
; array pour les coordonnées sur le graphique, les facteurs sont résolument arbitraires ^^
Dim $a[UBound($res)][2]
For $i = 0 to UBound($res)-1
$a[$i][0] = $i*15
$a[$i][1] = $H_grafik - $array[$i][1]*30+15
Next
;_ArrayDisplay($a)
$hGUI = GUICreate("Graph", 530, 200)
$g = GUICtrlCreateGraphic(10, 10, 510, $H_grafik)
GUICtrlSetBkColor(-1, 0xeeeeff)
GUICtrlSetColor(-1, 0)
GUICtrlSetGraphic($g, $GUI_GR_MOVE, 0, 50)
For $i = 0 to UBound($a)-1
GUICtrlSetGraphic($g, $GUI_GR_COLOR, 0xff)
GUICtrlSetGraphic($g, $GUI_GR_LINE, $a[$i][0], $a[$i][1])
GUICtrlSetGraphic($g, $GUI_GR_COLOR, 0xff0000)
GUICtrlSetGraphic($g, $GUI_GR_DOT, $a[$i][0], $a[$i][1])
Next
GUISetState()
Do
$b = GUIGetCursorInfo($hGUI)
If $b[4] = $g Then
$pos = MouseGetPos()
For $i = 0 to UBound($a)-1
If $pos[0]-10 > $a[$i][0]-2 and $pos[0]-10 < $a[$i][0]+2 Then
ToolTip($array[$i][0] &" x "& $array[$i][1])
EndIf
Next
Else
ToolTip("")
EndIf
Sleep(10)
Until GUIGetMsg() = $GUI_EVENT_CLOSE
;===================================================
; bricolage maison hâtif et abomiffreux
Func _ArrayMaxOrMin($avArray, $op = "max", $iCol = 1)
Local $iIndex = 0, $iRows = UBound($avArray), $iDims = UBound($avArray, 0)
If $op = "max" Then $op = "<"
If $op = "min" Then $op = ">"
Switch $iDims
Case 1 ; 1D
For $i = 0 To $iRows-1
If Execute(Number($avArray[$iIndex]) &$op& Number($avArray[$i])) Then $iIndex = $i
Next
Return $avArray[$iIndex]
Case 2 ; 2D
For $i = 0 To $iRows-1
If Execute(Number($avArray[$iIndex][$iCol-1]) &$op& Number($avArray[$i][$iCol-1])) Then $iIndex = $i
Next
Return $avArray[$iIndex][$iCol-1]
EndSwitch
EndFunc
Re: [..] Problème de remplissage array
Posté : lun. 26 août 2013 19:13
par Hugues
Merci,
Je suis grave perdu dans tout ce codage lol, ce qui est bizarre pour les mini maxi, c'est que ça m'affiche pas les bonnes valeurs?
Dans mon fichier, le mini_x = 0 et maxi_x = 7.25 et mini_y = 0.89 et maxi_y = 18.86 et la fonction me trouve mini_x = 0 et maxi_x = 7.00 et mini_y = 0.89 et maxi_y = 18.00...
J'ai aussi essayé avec ce code que Mikell m'avait déja donné

et ca me donne pareil
► Afficher le texte
Code : Tout sélectionner
Local $ValMax = 0
For $i = 0 To UBound($aDataXY) - 1
If Number($ValMax) < Number($aDataXY[$i][0]) Then $ValMax = $aDataXY[$i][0]
Next
MsgBox(0, "", "La valeur max est " & $ValMax)
? Ca doit-etre encor un truc bête...

Re: [..] Problème de remplissage array
Posté : lun. 26 août 2013 20:02
par mikell
Tu le posterais pas ce nouveau fichier ?
Re: [..] Problème de remplissage array
Posté : lun. 26 août 2013 20:13
par Hugues
Je suis vraiment désolé d'être bon à rien...
Voici mon fichier:
http://cjoint.com/?CHAumk8sxcA