IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Tableaux, problème d'index


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Par défaut Tableaux, problème d'index
    Bonjour,

    Je suis nouveau sur developpez.com, et malgré mes recherches je n'ai pas trouvé de réponse à mon problème.

    Dans mon code, je lis un fichier csv pour en récupérer les valeurs et ensuite tracer les courbes en fonction de ces points.

    La première colonne du fichier correspond à l'axe des temps et les colonnes suivantes aux valeurs à tracer en fonction du temps.

    Dans un premier temps, j'ai essayé de récupérer les 2 premières colonnes pour essayer de tracer une courbe via ZedGraph.

    Cependant le tableau contenant les valeurs de la courbes me renvoie une erreur
    L'index se trouve en dehors des limites du tableau.
    lorsque la lecture arrive après la dernière mesure.

    Le fichier contient 1197 valeurs, sans compter les 4 premières lignes du fichier qui contiennent l'entête dont je ne m'occupe pas pour le moment (d'où les 4 lectures "à vide" avant le traitement). Après les mesures, le fichier contient 2 lignes vides puis une ligne contenant sa date de création (dont je ne m'occupe pas non plus pour le moment).

    Ce fichier est généré sur demande par une application de mesures extérieur, je ne peux donc pas modifier sa mise en page.
    Les séparateur sont anglophones (',' pour séparer les valeurs et '.' pour séparer les décimales).

    Pour visualiser les valeurs enregistrées, j'ai crée 3 listbox dans lesquels j'affiche les tableaux contenant les mesures.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    string[] Tligne; // tableau qui va contenir les sous-chaines extraites d'une ligne.
    
    double[] mesures=new double[1200];
    double[] temps = new double[1200];
    int j = 0;
    
    if (File.Exists(file))
                {
                    StreamReader line = new StreamReader(file);
    
                    string ligne = line.ReadLine();
    
                    for (int i = 0; i < 3; i++) ligne = line.ReadLine();
    
    
                    do
                    {
                        ligne = line.ReadLine();
    
                        readCSV.Items.Add(ligne);
    
                        Tligne = ligne.Split(',');
    
                        // Choix du séparateur décimal
                        CultureInfo culture;
                        if (Tligne[0].Contains("."))
                        {
                            // Utilisation de InvariantCulture si présence du . comme séparateur décimal. 
                            culture = CultureInfo.InvariantCulture;
                        }
                        else
                        {
                            // Utilisation de CurrentCulture sinon (utilisation de , comme séparateur décimal).
                            culture = CultureInfo.CurrentCulture;
                        }
    
                        // Conversion de la chaîne en double, en utilisant la culture correspondante.
                        double.TryParse(Tligne[0], NumberStyles.Number, culture, out temps[j]);
    
                        // L'exception est levé ici lorsque j = 1197
                        double.TryParse(Tligne[1], NumberStyles.Number, culture, out mesures[j]);
    
    
                        for (int i = 0; i < Tligne.Length; i++)
                        {
                            splitCSV.Items.Add(Tligne[i]);
                        }
                        testTab.Items.Add(temps[j]);
                        j++;
    
    
    
    
                    }while(ligne != null);

    Je pensais que le problème était du au fait que Tligne contienne une valeur nulle à j = 1197, j'ai donc posé une condition pour vérifier cela mais l'exception persiste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    if(Tligne != null)
    {
                   // Conversion de la chaîne en double, en utilisant la culture correspondante.
                   double.TryParse(Tligne[0], NumberStyles.Number, culture, out temps[j]);
    
                   // L'exception est encore levé ici lorsque j = 1197
                   double.TryParse(Tligne[1], NumberStyles.Number, culture, out mesures[j]);
    }
    Je pense que c'est un problème avec les valeurs d'entrées du moins je ne vois que ca.

    Si vous avez une idée, je suis preneur.

    Merci d'avance.

  2. #2
    Membre averti Avatar de emiscool
    Profil pro
    architecte logiciel
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : architecte logiciel

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    effectivement tu doit poser une condition pour vérifier est ce qu'on a deux case dans le tableau Tligne ,

    pour cela tu doit pas mettre if Tligne != null parcontre tu doit faire un test sur la taille du tableau ( if(Tligne.Length == 2)) comme ca tu es sur qu'il y a deux case dans le tableau.

  3. #3
    Membre averti
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Par défaut
    Merci de ta réponse, elle m'a permis de résoudre ce problème

    A la suite de ça, j'ai dû modifier ma boucle while pour résoudre une erreur pointant sur l'envoie de données "null" à la listbox readCSV.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (line.EndOfStream != true)
    {
        ...
    }
    Cependant maintenant il n'y a plus d'exception mais les 3 dernières lignes du fichier (2 lignes vide + 1 ligne contenant sa date de création) sont traitées et me retournent chacune des '0'.

    Pour résoudre cela, j'ai utilisé une condition supplémentaire, en plus de celle sur la vérification du nombre de cases dans le tableau, pour exclure les lignes vides. Si la 2ème case du tableau est vide cela veut dire que soit la ligne est vide, soit il n'y a que la 1ère case de remplie (cas de la ligne contenant la date de création).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if ((Tligne.Length == 12)&&(Tligne[1] != null)) // 12 pour le nombre de colonnes que contient le fichier
    {
        // Conversion de la chaîne en double, en utilisant la culture correspondante.
        double.TryParse(Tligne[0], NumberStyles.Number, culture, out temps[j]);
        double.TryParse(Tligne[1], NumberStyles.Number, culture, out mesures[j]);
    }
    Mais cela n'a aucun effet, les 3 valeurs à 0 sont toujours présentes dans les 2 tableaux de récupération alors que théoriquement une case ne contenant aucune valeur devrait être "null".

    Je ne vois pas vraiment comment traiter cela, si vous avez une idée.

  4. #4
    Membre averti Avatar de emiscool
    Profil pro
    architecte logiciel
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : architecte logiciel

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    est ce que tu peut nous donné un fichier csv de test

  5. #5
    Membre averti
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Par défaut
    Voici un fichier csv pour test :
    Fichiers attachés Fichiers attachés

  6. #6
    Membre averti Avatar de emiscool
    Profil pro
    architecte logiciel
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : architecte logiciel

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    vérifier l'incrimentation de l'indix j, tu doit incrimenter le J si les conditions de test sont bien valide.

  7. #7
    Membre averti
    Homme Profil pro
    Architecte système
    Inscrit en
    Avril 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Architecte système

    Informations forums :
    Inscription : Avril 2010
    Messages : 28
    Par défaut
    Citation Envoyé par emiscool Voir le message
    vérifier l'incrimentation de l'indix j, tu doit incrimenter le J si les conditions de test sont bien valide.
    Merci

    Je n'y avait même pas fait attention à l'incrémentation de j, c'était tout simple en plus ... comme quoi un œil extérieur aide souvent à résoudre les problèmes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] problème avec while
    Par zimotep dans le forum Langage
    Réponses: 3
    Dernier message: 11/09/2005, 10h30
  2. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  3. [perl]Problème tableau indexé
    Par LE NEINDRE dans le forum Langage
    Réponses: 8
    Dernier message: 25/08/2005, 21h24
  4. Problème d'index avec load data file
    Par bruno782 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 09/03/2005, 12h11
  5. Problème d'index
    Par claude dans le forum SQL
    Réponses: 6
    Dernier message: 04/08/2003, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo