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
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 :D Normalement ça doit marcher. (alors il est bien mon regex? :P)
Alex1205

EDIT : Ah bah mince j'ai pas vu la réponse de mikell, je suis déçu :P 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
@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

Code : Tout sélectionner

1.01; 12.65
et dans ce cas ton regex ne marchera plus :P

@gary
par timidité probablement :mrgreen:
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 :wink:

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é :D
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 :mrgreen:

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

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! :lol: Ça me convient parfaitement!

Maintenant faut que je traite tout ca avec GDI et là c'est le drame... :mrgreen:

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 :mrgreen:

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

Re: [..] Problème de remplissage array

Posté : lun. 26 août 2013 14:00
par Hugues
Merci Mikell, :mrgreen:

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... :oops: :evil:
► Afficher le texte
Et le code de Mikell
► Afficher le texte

Re: [..] Problème de remplissage array

Posté : lun. 26 août 2013 17:54
par mikell
Franchement tu exagères :mrgreen: 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

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... :shock:

J'ai aussi essayé avec ce code que Mikell m'avait déja donné :oops: et ca me donne pareil
► Afficher le texte
? Ca doit-etre encor un truc bête... :oops:

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... :oops: :oops:
Voici mon fichier:http://cjoint.com/?CHAumk8sxcA