Courbe d'un fichier texte avec C#

Résolu
Navas8 Messages postés 19 Date d'inscription mercredi 6 mai 2015 Statut Membre Dernière intervention 15 juin 2015 - Modifié par Whismeril le 6/05/2015 à 11:54
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 - 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++;

7 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
6 mai 2015 à 11:59
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....
0
Navas8 Messages postés 19 Date d'inscription mercredi 6 mai 2015 Statut Membre Dernière intervention 15 juin 2015
Modifié par Navas8 le 6/05/2015 à 12:31
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();      
            
        }
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
6 mai 2015 à 15:17
mais pour le "}", je l'ai juste oublié en recopiant


je m'en doutais.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
Modifié par Whismeril le 6/05/2015 à 15:22
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
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
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; }
    }
}
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656 > Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024
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.
0
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
........
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
11 mai 2015 à 10:23
Bonjour ça dépend que veut tu afficher? L'heure et la valeur de Data?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
11 mai 2015 à 11:46
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);
        }
    }
}

0
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	
0
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);
        }
    }
}
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
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.
0
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
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
12 mai 2015 à 13:02
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.
0
Rejoignez-nous