Courbe d'un fichier texte avec C# [Résolu]

Navas8 19 Messages postés mercredi 6 mai 2015Date d'inscription 15 juin 2015 Dernière intervention - 6 mai 2015 à 09:35 - Dernière réponse : Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention
- 12 mai 2015 à 13:02
Bonjour
Je cherche à faire une courbe avec mon fichier texte en utilisant chart mais j'ai des problèmes avec mon programme
il me met toujours la même erreur: Un élément de graphique portant le nom « serie0 » existe déjà dans « SeriesCollection ». il considére le 0 comme un truc rajouté à serie

chart1.Series.Add("serie" + index);

Juste une remarque, mon fichier a cette architecture suivante:

100;100
105;115
105;130
105;145
135;160
145;200
200;215

voila le programme. C'est urgent merci d'avance

StreamReader sr = new StreamReader(@"C:\Documents and Settings\mhocine\Mes documents\Stage Amadou\points.txt");
             //PointConverter pc = new PointConverter();
            string line;
            int index = 0;
            while (!sr.EndOfStream)
            {
                line = sr.ReadLine();
               
                    chart1.Series.Clear();
                    
                    chart1.Series.Add("serie" + index);
                //ArrayList points = new ArrayList();
               foreach (string i in line.Split(' '))
                    {
                        chart1.Series[chart1.Series.Count - 1].Points.AddXY(double.Parse(i.Split(';')[0]), double.Parse(i.Split(';')[1]));
                    }

                    chart1.Series[chart1.Series.Count - 1].ChartType = SeriesChartType.FastLine;
                    chart1.Series[chart1.Series.Count - 1].Color = Color.Red;
                    index++;
Afficher la suite 

Votre réponse

14 réponses

Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 6 mai 2015 à 11:59
0
Merci
Bonjour tout d'abord, sur la forme:
  • J'ai édité ton message pour y ajouter la coloration syntaxique.
  • Ce qui est urgent, pour les bénévoles qui animent ce forum, ça n'est surtout pas de répondre à une question, à midi, ce sera plutôt d'aller manger....


Sur le fond, tu effaces toutes tes séries à chaque itération, donc l'apparition de ce message est surprenante.
Ce qui devrait arriver, c'est que ton chart n'affiche que la derniere ligne de ton fichier. Après tu n'as pas mis le code de la boucle en entier, il manque au moins une }, mais comment en être sûr....
Commenter la réponse de Whismeril
Navas8 19 Messages postés mercredi 6 mai 2015Date d'inscription 15 juin 2015 Dernière intervention - Modifié par Navas8 le 6/05/2015 à 12:31
0
Merci
Au faite c'est bon j'ai trouvé la solution. Merci pour tes remarques Whismeril, mais pour le "}", je l'ai juste oublié en recopiant. Vous trouverez ci-dessous le bon programme.
Maintenant disons que je veux une courbe de température en temps réelle, avec sa valeur minimale et maximale sachant que mon fichier contient des données ASCII.
{
            StreamReader sr = new StreamReader(@"C:\points.txt");
             
            //ArrayList points = new ArrayList();
            //PointConverter pc = new PointConverter();

            string line;
            int index = 0;
            chart1.Series.Add("serie" + index);
            

            while (!sr.EndOfStream)
            {
                
                line = sr.ReadLine();
                
                
                chart1.Series[chart1.Series.Count - 1].Points.AddXY(double.Parse(line.Split(';')[0]), double.Parse(line.Split(';')[1]));
            }

            chart1.Series[chart1.Series.Count - 1].ChartType = SeriesChartType.FastLine;
            chart1.Series[chart1.Series.Count - 1].Color = Color.Red;
            sr.Close();      
            
        }
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 6 mai 2015 à 15:17
mais pour le "}", je l'ai juste oublié en recopiant


je m'en doutais.
Commenter la réponse de Navas8
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - Modifié par Whismeril le 6/05/2015 à 15:22
0
Merci
Pour moi le traitement du fichier texte et l'affichage des courbes c'est deux choses différentes.

J'aurais écrit une classe qui lit le fichier, extrait les températures, les convertit en nombre (double, single, décimal....) et les stocke (dans une liste par exemple).

De cette liste, il est ensuite simple d'extraire des calculs (min, max, moyenne, .....)
De cette liste, il est aussi simple ensuite de tracer la courbe.

Modérer m'amène à intervenir dans de nombreux posts, mais les seuls langages que je connaisses sont le C# et un peu de VB. Pour vos codes pensez à la coloration.
Réponse trouvée ->Question Résolue
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 6 mai 2015 à 15:55
Vite fait, un truc comme ça
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace WindowsFormsApplication1
{
    public class DonneesNavas
    {
        public DonneesNavas(string FileName)
        {
            Points = (from ligne in File.ReadAllLines(FileName)
                      let valeurs = ligne.Split(';')
                      select new Coordonnees
                      {
                          X = double.Parse(valeurs[0]),
                          Y = double.Parse(valeurs[1])
                      }).ToList();
        }

        public List<Coordonnees> Points { get; set; }

        public double MaxX
        {
            get { return Points.Max(p => p.X); }
        }
    }

    public class Coordonnees
    {
        public double X { get; set; }

        public double Y { get; set; }
    }
}
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention > Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 6 mai 2015 à 15:58
dans ton exemple toutes les données sont des entiers, alors on peut utiliser la classe Point (dans system.Drawing) plutot que Coordonnées, mais j'ai préféré laisser la possibilité que tes données soient décimales.
Commenter la réponse de Whismeril
0
Merci
Maintenant les données du fichier texte se présente comme suit. Avez vous une idée de comment je peut modifier mon programme précédent ou le votre pour tracer ma courbe en prenant en compte ces nouvelles données?

Custom Name:File
Name:04270000
Name:Trend1 Start:27/04/2015 22:24:06 End:27/04/2015 22:25:22
Sample:00:00:02
Curve Name:T Consigne Curve
Min:0Curve Max:0
Time:27/04/2015 22:24:06
Data:83
Time:27/04/2015 22:24:08
Data:83
Time:27/04/2015 22:24:10
Data:83
Time:27/04/2015 22:24:12
Data:83
Time:27/04/2015 22:24:14
Data:83
Time:27/04/2015 22:24:16
Data:83
Time:27/04/2015 22:24:18
Data:83
Time:27/04/2015 22:24:20
Data:83
Time:27/04/2015 22:24:22
Data:83
Time:27/04/2015 22:24:24
Data:83
........
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 11 mai 2015 à 10:23
Bonjour ça dépend que veut tu afficher? L'heure et la valeur de Data?
Commenter la réponse de Navas8
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 11 mai 2015 à 11:46
0
Merci
Bon en supposant que tu veuilles l'heure et la Data.
J'ai utilisé une regex, je ne lui ai pas laissé de latitude (à part Data qui peut avoir de 1 à n chifffres), donc si le format de ton fichier est un peu différent ça ne va pas marcher (data déciamale, date écrite à l'anglaise, suppression de l'espace en fin de ligne, etc..)
Cela dit ça peut se gérer

using System.Collections.Generic;
using System.IO;
using System;
using System.Text.RegularExpressions;

namespace WindowsFormsApplication1
{
    public class DonneesNavas
    {
        public DonneesNavas(string FileName)
        {
            Regex maRegex = new Regex(@"Time:(?<heure>(\d{2}/){2}\d{4} (\d{2}:){2}\d{2}) \r\nData:(?<donnee>\d+) ");//Regex qui reprend le format des 2 lignes de données et donne un mon aux parties de texte qui nous importent
            
            MatchCollection matches = maRegex.Matches(File.ReadAllText(FileName));
            Points = new List<Coordonnees>();

            for (int i = 0; i < matches.Count; i++)//la requete Linq ne marche pas avec matchcollection, donc je fais un for
                Points.Add(new Coordonnees
                {
                    Data = int.Parse(matches[i].Groups["donnee"].Value),
                    Heure = DateTime.Parse(matches[i].Groups["heure"].Value)
                });

        }

        public List<Coordonnees> Points { get; set; }

    }

    public class Coordonnees
    {

        public int Data { get; set; }

        public DateTime Heure { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}", Heure.ToShortTimeString(), Data);
        }
    }
}

Aurais tu une idée de comment de pourrait le faire avec chart, parce que j'ai du mal à comprendre ta méthode qui me met ca comme erreur:
Erreur	1	'WindowsFormsApplication1.Form1.Dispose(bool)' : aucune méthode appropriée n'a été trouvée pour la substitution	
Erreur 1 'WindowsFormsApplication1.Form1' ne contient pas un constructeur qui accepte des arguments 0 


Voici le programme:
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1( string FileName)
        {
            InitializeComponent();
            Regex maRegex = new Regex(@"Time:(?<heure>(\d{2}/){2}\d{4} (\d{2}:){2}\d{2}) \r\nData:(?<donnee>\d+) ");//Regex qui reprend le format des 2 lignes de données et donne un mon aux parties de texte qui nous importent

            MatchCollection matches = maRegex.Matches(File.ReadAllText(FileName));
            Points = new List<Coordonnees>();

            for (int i = 0; i < matches.Count; i++)//la requete Linq ne marche pas avec matchcollection, donc je fais un for
                Points.Add(new Coordonnees
                {
                    Data = int.Parse(matches[i].Groups["donnee"].Value),
                    Heure = DateTime.Parse(matches[i].Groups["heure"].Value)
                });

        }
        public List<Coordonnees> Points { get; set; }
        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
    public class Coordonnees
    {

        public int Data { get; set; }

        public DateTime Heure { get; set; }

        public override string ToString()
        {
            return string.Format("{0}: {1}", Heure.ToShortTimeString(), Data);
        }
    }
}
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 11 mai 2015 à 18:01
Le code que je t'ai proposé est celui d'une classe qui lirait le fichier.
Pas celui d'une Form.
Commenter la réponse de Whismeril
0
Merci
c'est bon y a plus d'erreur mais je ne vois toujours pas comment faire une courbe avec votre programme. Si vous avez une idée de comment je pourrai le combiner avec mon chart ( de mon programme) ou une manière de faire une courbe avec ce fichier, sa m'aiderai beaucoup
Commenter la réponse de Navas8
Whismeril 12030 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 22 septembre 2018 Dernière intervention - 12 mai 2015 à 13:02
0
Merci
Comme je te l'ai dit plus haut, la classe telle que je te la propose sert à lire le fichier et à stocker les données. A partir de là, comme demandé tu peux déterminer un max, un min, une moyenne, etc...

Enfin puisque tu as une collection, tu peux la parcourir pour charger les données dans le chart.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.