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 :

Problème mysterieux de StringBuilder


Sujet :

C#

  1. #1
    Membre confirmé Avatar de Flow_75
    Homme Profil pro
    Ingénieur
    Inscrit en
    mai 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : mai 2005
    Messages : 1 036
    Points : 626
    Points
    626
    Par défaut Problème mysterieux de StringBuilder
    Bonjour,

    J'ai depuis quelques semaine, un soucis vraiment bizarre.

    Je lis un chaine de mesure pour récuperer une mesure.
    Cette mesure est formaté et mise dans un fichier csv.

    Depuis une nouvelle version, la dernière (ou avant dernière) ligne d'un capteur est aberrante (c'est une voie de température) (où 30 secondes avant, ca vaut 19° puis la première ligne du fichier, 19°)
    Donc, j'ai regardé et mis en log la valeur et elle est bonne (coherente).
    J'ai mis un log également après le formatage de la chaine et juste avant qu'elle soit mise dans le string builder

    Pièce jointe 595971

    En 1, la valeur est bonne,
    En 2, la valeur est toujours la meme qu'en 1,
    En 3, la valeur est encore bonne,
    Mais dans le fichier csv, c'est pas bon.

    Ci-dessous la sortie que me donne mes logs :
    Pièce jointe 595973

    Et la sortie de mon csv :
    Pièce jointe 595974

    Je ne vois absolument pas d'où peut venir ce soucis

    Merci pour votre aide.

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    2 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 2 639
    Points : 10 354
    Points
    10 354
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Il serait intéressant d'avoir plus de code, et d'avoir un fichier csv complet pour vous aider à résoudre le souci, car là, nous manquons d'éléments.
    Au niveau du code, l'idéal serait de la création du StringBuilder à l'écriture dans le fichier CSV (si ce n'est pas trop long !). Et pour le partage de code, il y a une balise dédiée qui fait du formatage
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre confirmé Avatar de Flow_75
    Homme Profil pro
    Ingénieur
    Inscrit en
    mai 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : mai 2005
    Messages : 1 036
    Points : 626
    Points
    626
    Par défaut
    Bnojour Francois,

    Désolé du delai, on se doit d'attendre quatre heures après chaque modification.

    Le code avec le stringBuilder :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
            private void EnregistrementModeAuto_EcritureLigne(object source, ElapsedEventArgs e)
            {
                try
                {
                   // Logger.Logger.EcrireMessage("Nouvelle ligne dans le fichier d'acquisition : " + DateTime.Now.ToString("HH:mm:ss.fff"), typeof(CEnregistrement), TypeMessage.INFO_FICHIER_ACQUISITION);
                    string DateNow = DateTime.Now.ToString("dd/MM/yyyy");
                    string TimeNow = DateTime.Now.ToString("HH:mm:ss" + CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator + "fff");
     
                    StringBuilder ligne = new StringBuilder(DateNow + "\t" + TimeNow + "\t");
     
                    for (int i = 0; i < m_ConfigurationAcquisition.ListeVoiesEnregistrees.Length; i++)
                    {
                        if (m_ConfigurationAcquisition.ListeVoiesEnregistrees[i].ToLower() == ConstantesPilotage.TEMPERATURE_AMBIANTE_BOITE_1.ToLower())
                        {
                            double val = m_PL.LectureDerniereValeur(m_ConfigurationAcquisition.ListeVoiesEnregistrees[i]);
     
                            if (val > m_Amb1_Max)
                                m_Amb1_Max = val;
     
                            if (val < m_Amb1_Min)
                                m_Amb1_Min = val;
     
                            ligne.Append(val.ToString("0.000")).Append("\t").Append(m_Amb1_Max.ToString("0.000")).Append("\t").Append(m_Amb1_Min.ToString("0.000")).Append("\t");
     
                        }
                        else if (m_ConfigurationAcquisition.ListeVoiesEnregistrees[i].ToLower() == ConstantesPilotage.TEMPERATURE_AMBIANTE_BOITE_2.ToLower())
                        {
                            double val = m_PL.LectureDerniereValeur(m_ConfigurationAcquisition.ListeVoiesEnregistrees[i]);
     
                            if (val > m_Amb2_Max)
                                m_Amb2_Max = val;
     
                            if (val < m_Amb2_Min)
                                m_Amb2_Min = val;
     
                            ligne.Append(val.ToString("0.000")).Append("\t").Append(m_Amb2_Max.ToString("0.000")).Append("\t").Append(m_Amb2_Min.ToString("0.000")).Append("\t");
                        }
                        else if (m_ConfigurationAcquisition.ListeVoiesEnregistrees[i] == ConstantesPilotage.ENREGISTREMENT_CRITERE)
                        {
                            Dictionary<string, double> valeursTemperature = LectureVoiesTemperature();
     
                            string CritereA = DeterminationValeurCritereA(valeursTemperature);
                            string CritereB = DeterminationValeurCritereB(valeursTemperature);
                            string CritereC = DeterminationValeurCritereC(valeursTemperature);
                            string CritereD = DeterminationValeurCritereD(valeursTemperature);
     
                            ligne.Append(CritereA).Append("\t");
                            ligne.Append(CritereB).Append("\t");
                            ligne.Append(CritereC).Append("\t");
                            ligne.Append(CritereD).Append("\t");
                            ligne.Append(m_valeurE1).Append("\t");
                            ligne.Append(m_valeurE2).Append("\t");
                        }
                        else
                        {
                            try
                            {
                                ligne.Append(m_PL.LectureDerniereValeur(m_ConfigurationAcquisition.ListeVoiesEnregistrees[i]).ToString("0.000")).Append("\t");
                            }
                            catch (Exception ex)
                            {
                                Logger.Logger.EcrireMessage(ex);
                            }
     
                        }
                    }
     
     
                        try
                        {
                            // modif de bug de la V1.1.3 : le logiciel recrée un fichier d'acquisition 
                            // avec une seule ligne apres un arrêt sur un defaut (renommage fichier d'acquisition courant,
                            // puis creation d'un nouveau fichier avec une seule ligne.
                            if (File.Exists(m_NomRepertoire + m_NomFichier))
                            {
                                lock (locker)
                                {
                                    using (m_sw = new StreamWriter(m_NomRepertoire + m_NomFichier, true))
                                    {
                                        m_sw.WriteLine(ligne);
                                    }
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Logger.Logger.EcrireMessage(ex);
                        }
     
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                }
            }
    Le code avec un File.AppendAllText 'avec les meme résultats :-/
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     private void EnregistrementModeAuto_EcritureLigne( object source, ElapsedEventArgs e )
            {
                try
                {
                    // Logger.Logger.EcrireMessage("Nouvelle ligne dans le fichier d'acquisition : " + DateTime.Now.ToString("HH:mm:ss.fff"), typeof(CEnregistrement), TypeMessage.INFO_FICHIER_ACQUISITION);
                    string DateNow = DateTime.Now.ToString( "dd/MM/yyyy" );
                    string TimeNow = DateTime.Now.ToString( "HH:mm:ss" + CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator + "fff" );
     
     
     
     
                    string ligne = DateNow + "\t" + TimeNow + "\t";
     
                    for(int i = 0; i < m_ConfigurationAcquisition.ListeVoiesEnregistrees.Length; i++)
                    {
                        if(m_ConfigurationAcquisition.ListeVoiesEnregistrees[i].ToLower() == ConstantesPilotage.TEMPERATURE_AMBIANTE_BOITE_1.ToLower())
                        {
                            double val = m_PL.LectureDerniereValeur( m_ConfigurationAcquisition.ListeVoiesEnregistrees[i] );
     
     
                            Logger.Logger.EcrireMessage( "Return Value AMB1 : " + val, this, TypeMessage.ERROR );
                            Logger.Logger.EcrireMessage( "Return Value AMB1 Previous Max :  : " + m_Amb1_Max, this, TypeMessage.ERROR );
                            Logger.Logger.EcrireMessage( "Return Value AMB1 Previous Min :  : " + m_Amb1_Min, this, TypeMessage.ERROR );
     
                            if(val > m_Amb1_Max)
                                m_Amb1_Max = val;
     
                            if(val < m_Amb1_Min)
                                m_Amb1_Min = val;
     
                            Logger.Logger.EcrireMessage( "Return Value AMB1 Next : " + val, this, TypeMessage.ERROR );
                            string resultat = string.Format( "{0:0.000}\t{1:0.000}\t{2:0.000}", val, m_Amb1_Max, m_Amb1_Min );
     
                            ligne += resultat;
                            ligne += "\t";
                        }
                        else if(m_ConfigurationAcquisition.ListeVoiesEnregistrees[i].ToLower() == ConstantesPilotage.TEMPERATURE_AMBIANTE_BOITE_2.ToLower())
                        {
                            double val = m_PL.LectureDerniereValeur( m_ConfigurationAcquisition.ListeVoiesEnregistrees[i] );
                            Logger.Logger.EcrireMessage( "Return Value AMB2 : " + val, this, TypeMessage.ERROR );
                            Logger.Logger.EcrireMessage( "Return Value AMB2 Previous Max :  : " + m_Amb2_Max, this, TypeMessage.ERROR );
                            Logger.Logger.EcrireMessage( "Return Value AMB2 Previous Min :  : " + m_Amb2_Min, this, TypeMessage.ERROR );
     
                            if(val > m_Amb2_Max)
                                m_Amb2_Max = val;
     
                            if(val < m_Amb2_Min)
                                m_Amb2_Min = val;
                            Logger.Logger.EcrireMessage( "Return Value AMB2 Next : " + val, this, TypeMessage.ERROR );
     
                            string resultat = string.Format( "{0:0.000}\t{1:0.000}\t{2:0.000}", val, m_Amb2_Max, m_Amb2_Min );
                            //val.ToString("0.000")      "\t").Append(m_Amb2_Max.ToString("0.000")).Append("\t").Append(m_Amb2_Min.ToString("0.000"));
     
                            Logger.Logger.EcrireMessage( "String To be printed : \"" + resultat + "\"", this, TypeMessage.ERROR );
     
                            ligne += resultat;
                            ligne += "\t";
                        }
                        else if(m_ConfigurationAcquisition.ListeVoiesEnregistrees[i] == ConstantesPilotage.ENREGISTREMENT_CRITERE)
                        {
                            Dictionary<string, double> valeursTemperature = LectureVoiesTemperature();
     
                            string CritereA = DeterminationValeurCritereA( valeursTemperature );
                            string CritereB = DeterminationValeurCritereB( valeursTemperature );
                            string CritereC = DeterminationValeurCritereC( valeursTemperature );
                            string CritereD = DeterminationValeurCritereD( valeursTemperature );
     
                            ligne += CritereA;
                            ligne += "\t";
                            ligne += CritereB;
                            ligne += "\t";
                            ligne += CritereC;
                            ligne += "\t";
                            ligne += CritereD;
                            ligne += "\t";
                            ligne += m_valeurE1;
                            ligne += "\t";
                            ligne += m_valeurE2;
                            ligne += "\t";
                        }
                        else
                        {
                            try
                            {
                                ligne += m_PL.LectureDerniereValeur( m_ConfigurationAcquisition.ListeVoiesEnregistrees[i] ).ToString( "0.000" );
                                ligne += "\t";
                            }
                            catch(Exception ex)
                            {
                                Logger.Logger.EcrireMessage( ex );
                            }
                        }
                    }
     
                    try
                    {
                        if(File.Exists( m_NomRepertoire + m_NomFichier ))
                        {
     
                            Logger.Logger.EcrireMessage( "line To be printed : \"" + ligne + "\"", this, TypeMessage.ERROR );
                            File.AppendAllText( m_NomRepertoire + m_NomFichier, ligne );
                            File.AppendAllText( m_NomRepertoire + m_NomFichier, Environment.NewLine );
                        }
                    }
     
                    catch(Exception ex)
                    {
                        Logger.Logger.EcrireMessage( ex );
                    }
                }
                catch(Exception ex)
                {
                    Console.WriteLine( ex );
                }
            }
    Le fichier de sortie est en pièce jointe.

    Merci.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    février 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : février 2009
    Messages : 149
    Points : 216
    Points
    216
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // modif de bug de la V1.1.3 : le logiciel recrée un fichier d'acquisition 
    // avec une seule ligne apres un arrêt sur un defaut (renommage fichier d'acquisition courant,
    // puis creation d'un nouveau fichier avec une seule ligne.
    Ne peut-il pas s'agir d'un autre bug lié à cet "arrêt sur un défaut" ?

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    2 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juillet 2016
    Messages : 2 639
    Points : 10 354
    Points
    10 354
    Billets dans le blog
    21
    Par défaut
    En regardant le code et les résultats, je suis du même avis que Krantz. Surtout que la dernière ligne présente des anomalies étonnantes. Par exemple, Amb1_Min qui vaut 0, alors que la valeur 0 n'a jamais été atteinte !

    Pour Amb2, la valeur est 0. Plus petite que le min, mais le min n'est pas mis à jour ! Ou alors, il y a un décallage entre les entêtes et le contenu des colonnes...

    J'ai l'impression qu'il y a un bout de code ailleurs qui rajoute une ligne à la fin du fichier. Je rajouterais bien un Logger sur la ligne au moment de l'écriture dans le fichier. Cela permettra de comparer plus facilement les logs avec le CSV en ayant les lignes complètes (et notamment, la date et l'heure).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Membre confirmé Avatar de Flow_75
    Homme Profil pro
    Ingénieur
    Inscrit en
    mai 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : mai 2005
    Messages : 1 036
    Points : 626
    Points
    626
    Par défaut
    Bonjour François,

    Merci beaucoup de ton aide.
    J'ai trouvé le soucis.
    comme tu l'avais deviné, le soucis venait d'un code à coté qui prenait le fichier et modifiait les deux colonnes.

    Les colonnes etaient mal ordonnées.
    Merci encore.
    F.

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

Discussions similaires

  1. StringBuilder : problème de mémoire
    Par jejeman dans le forum Langage
    Réponses: 5
    Dernier message: 28/10/2015, 21h15
  2. problème avec StringBuilder
    Par dhay06 dans le forum C#
    Réponses: 2
    Dernier message: 30/04/2010, 14h48
  3. Réponses: 1
    Dernier message: 06/11/2008, 09h23
  4. Problème avec la classe StringBuilder sous Eclipse
    Par Premium dans le forum Eclipse Java
    Réponses: 26
    Dernier message: 24/10/2006, 10h15
  5. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18

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