Fichier .txt volumineux

Résolu
DragZ - 3 févr. 2020 à 14:51
DragZ_
Messages postés
6
Date d'inscription
jeudi 6 février 2020
Statut
Membre
Dernière intervention
7 février 2020
- 7 févr. 2020 à 09:08
Bonjour,
j'ai un petit soucis mon programme dois récupérer un fichier log et l'écrire dans un richtext box ou autre (je débute en c# donc je connais pas tout) j'aimerai d'abord afficher entièrement le fichier et après trier et afficher que les lignes avec l'heure sélectionné si vous pouviez m'aidez je prend toute aide possible merci d'avance !

24 réponses

Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
4 févr. 2020 à 16:49
Ok.
Tu n’as pas mis l’extrait dans les balises de code, du coup, s’il y a des espaces en double ou des tabulations, ça a sauté, et le code que je te proposerai sera peut-être pas parfaitement opérationnel.

Je tache de te poster un exemple dans la soirée.


j'apprend le c# sur le tas donc ça demande de la patiente ^^
Ok, mais as tu acquis les bases, le meilleur conseil que je puisse te donner si ça n’est pas le cas est de laisser ton projet quelques jours, le temps de suivre un cours en ligne.
Celui de Tahé est très bien http://tahe.developpez.com/dotnet/csharp/
Ne saute pas d’étape même si ça te parait évident, car tu pourrais passer à côté d’une notion importante.
Ça ne fera pas de toi un codeur hors pair, mais te donnera un bon socle sur lequel construire ta formation.

1
Je te remercie c'est vraiment génial les gens comme toi qui prennent le temps d'aider merci beaucoup !
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151
4 févr. 2020 à 18:45
Bonsoir DragZ
J'ai fait un mini projet avec les lignes que tu avais mises au message 8
Je suis capable avec ce projet d'afficher dans une RichTexBox n'importe quel fichier texte quelle que soit sa taille . Il reprend le principe du message 10
Si cela t'intéresse j'ai posté le code source du projet : cela te fera une bonne base pour continuer : https://codes-sources.commentcamarche.net/source/102978-explorateur-fichier-texte
Tu pourras voir ton fichier log en entier
Ensuite sur le même principe tu n'auras qu'à créer l'interface pour spécifier les dates ou autres paramètres pour ne prendre que les lignes qui t'intéressent pour les ré afficher ensuite .
1
Merci beaucoup je vais m'en inspiré !
0
Je regarde pas mal a ton code j'aimerai savoir à quoi te sert le menu strip à la différence du opfd?
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > DragZ
5 févr. 2020 à 17:53
Bonsoir
Le MenuStrip te sert à ouvrir un fichier .log quelconque
Car chez toi il est possible qu'il n' a qu'un seul fichier .log qui t'intéresse : donc toi tu l'ouvres directement au chargement de la Form avec l'Openfiledialog
Moi dans mon projet j' affiche la Form et avec le Menu j'ouvre le fichier que je veux (*.log ou *.txt)
Tu dis que sur un fichier de 6G cela n'a pas fonctionné : quelle était le type d'erreur et sur quelle ligne de mon projet ?
Sans cette information je ne puis rien faire .
0
Apparement 6GO la lecture n'est pas passez xD
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > DragZ
6 févr. 2020 à 04:43
Bonsoir
Je comprends que cela ne passe pas si ton fichier fait 6 Go
On ne peut l'ouvrir avec aucun traitement de Texte ( même Word dans Office 2016 n'y arrive pas : il est limité à 512 Mo pour ouvrir un fichier texte )
il serait bien préférable de travailler avec une base de données .
Et là c'est une autre histoire : je n'ai jamais bossé avec les bases de données
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
4 févr. 2020 à 22:19
Voilà mon petit exemple, vite fait, donc largement perfectible.

Le résultat visuel d'abord


Sur form1 du projet (et namespace) TestWinform, il y a 2 DateTimePicker au Format Time, une ListBox et un DataGridView.

Dans la listBox n'apparaissent que les erreurs présentent dans l'intervalle de temps.
Quand on sélectionne une erreur, toutes les occurrences dans l'intervalle de temps apparaissent dans le DataGridView.

Pour en arriver là, j'ai écrit une classe Log, avec 3 propriétés Datation, Erreur et Details (bien sûr si le découpage que j'ai fait doit être plus fin c'est largement gérable) et une méthode permettant de Parser les lignes de ton fichier.
Si le format n'est pas reconnu, j'ai généré une erreur, ça te permettra en mode debug de copier coller ici la ligne qui ne fonctionne pas pour améliorer le découpage.

Voici cette classe
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Test_Winform
{
    class Log
    {
        public DateTime Datation { get; set; }

        public string Erreur { get; set; }

        public string Details { get; set; }

        public static Log Parse(string Ligne)
        {
            //utilisation d'un regex pour tester le format et faire un premier découpage de la ligne
            Match m = Regex.Match(Ligne, @"^(?<moi>\d\d?)/(?<jour>\d\d?)/(?<annee>\d{4})\s+(?<heure>\d\d?):(?<minute>\d\d?):(?<seconde>\d\d?)\s+(?<ampm>[AP]M):(?<ms>\d{1,3})\s+(?<erreur>.+?)::(?<details>.+)$");
            if (m.Success)
            {
                //il faut découper les valeurs de datation, car DateTime.Parse n'aime le jours, mois, heures, minutes, secondes sur 1 chiffre
                int jour = int.Parse(m.Groups["jour"].Value);
                int moi = int.Parse(m.Groups["moi"].Value);
                int annee = int.Parse(m.Groups["annee"].Value);
                int heure = int.Parse(m.Groups["heure"].Value);
                int minute = int.Parse(m.Groups["minute"].Value);
                int secondes = int.Parse(m.Groups["seconde"].Value);

                //si ce nombre est bien des ms, alors 47 venant après 466 dans l'exemple 47 vaut 470, par extension 5 vaudrait 500
                string MS = m.Groups["ms"].Value;
                int ms = int.Parse(MS);
                if (MS.Length == 1)
                    ms *= 100;
                else if (MS.Length == 2)
                    ms *= 10;

                DateTime date = new DateTime(annee, moi, jour, heure, minute, secondes, ms);

                //Ajustement AP PM
                if (m.Groups["ampm"].Value == "PM")
                    date = date.AddHours(12);

                return new Log
                {
                    Datation = date,
                    Erreur = m.Groups["erreur"].Value,
                    Details = m.Groups["details"].Value
                };
            }

            throw new Exception("Format de ligne non reconnu");
        }
    }
}


et le code behind de form1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Test_Winform
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ChargerFichier();

            //dtpDebut et dtpFin sont des DateTimePicker dont le format d'affichage est "Time"
            dtpDebut.Value = lesLogs.First().Datation;
            dtpFin.Value = lesLogs.Last().Datation;
        }

        List<Log> lesLogs = new List<Log>();//liste de tous les logs
        private void ChargerFichier()
        {
            string[] lignes = File.ReadAllLines("test.txt");//chaque ligne est chargée dans un emplacement de tableau

            foreach(string l in lignes)//on itère le tableau pour créer la liste de logs
            {
                lesLogs.Add(Log.Parse(l));
            }
        }

        private void DateTimePicher_ValueChanged(object sender, EventArgs e)
        {
            //les événements ValueChanged de dtpDebut et dtpFin sont tous deux abonnées à cette méthode
            IEnumerable<Log> logsFiltres = lesLogs.Where(l => l.Datation >= dtpDebut.Value && l.Datation <= dtpFin.Value);//requête qui filtre les logs par date

            List<IGrouping<string, Log>> logsGroupes = logsFiltres.GroupBy(l => l.Erreur).ToList();//regroupement des logs filtrés par erreur

            lbxErreurs.DataSource = null;
            lbxErreurs.DataSource = logsGroupes;
            lbxErreurs.DisplayMember = "Key";//les logs groupés sont affichés dans la listBox
        }

        private void lbxErreurs_SelectedIndexChanged(object sender, EventArgs e)
        {
            //L'évènement SelectIndexChanged de la listBox est abonné à cette méthode.
            if (lbxErreurs.SelectedIndex == -1)
                return;// rien n'est sélectionné => on sort

            ListBox lbx = sender as ListBox;
            IGrouping<string, Log> logGroupe = lbx?.SelectedItem as IGrouping<string, Log>;

            if (logGroupe == null)
                return; //Y'a un problème => on sort

            dgwLog.DataSource = null;
            dgwLog.DataSource = logGroupe.ToList();//on affiche les log dans le créneau horaire, avec l'erreur sélectionnée
        }
    }
}
1
c'est super intéressant merci beaucoup le seul soucis c'est qu'il ce passe dans un DataGridView je voulais savoir si c'était possible dans un textBox ou bien uniquement en datagridview, merci d'avance je vais déja me servir de ton programme pour bien avancer !
0
Des que je lance l'app il me ramène directement à la ligne d'exception sans trop comprendre pourquoi...
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
5 févr. 2020 à 15:57
Dans le cas present non, ça vient simplement du fait que cette ligne ne correspond pas au modèle que j’ai écrit dans la regex.

J’y retravaille ce soir.
Et je ferais en sorte, qu’une ligne rejetée alimente un fichier d’erreur, plutôt que de planter l’application
1
Te presse pas pour moi mais j'aimerai bien avoir les mêmes compétence ça m'éviterai de demander tout le temps ^^'
Mais merci beaucoup en tous cas !
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
5 févr. 2020 à 16:04
En attendant,
Dans ces lignes
1/30/2020 4:03:51 PM:372 PLC_T12 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 712124
1/30/2020 4:03:51 PM:374 PLC_T13 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 713124
1/30/2020 4:03:51 PM:414 Gestionnaire Attribution C_SPY AbonneSql::traiteMessage [L:879] Traitement message MessageEvtDeclenchementHorloge(107) n°573 : 0 ms

Quel texte est l’erreur, et à quoi correspond (de manière générale) le reste
0
DragZ > Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022

5 févr. 2020 à 16:06
En gros si tu veux des que j'ai un N_ERREUR il faut que je l'écrive le reste je connais pas encore tout pour pouvoir t'apporter des précision sur ça
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596 > Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022

5 févr. 2020 à 16:08
Et aussi, quand il n’y a pas de millisecondes, y a t il les : après PM?
0
DragZ > Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022

5 févr. 2020 à 16:18
Après le PM il ya la provenance du log et le type du log donc N_ERREUR ect...
0

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

Posez votre question
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
5 févr. 2020 à 21:54
Alors,

j'ai adapté le découpage des log selon ces critères
  • D'abord, la date,
  • puis l'heure sur 12h
  • puis l'indication AM/PM
  • puis :
  • puis en option les milliseconde (comme tu n'as pas répondu si les : sont présents quand il n'y a pas de millisecondes, j'ai considéré que oui)
  • puis un ou plusieurs mots que j'ai appelé Module
  • puis l'erreur, au format : Une Majuscule un underscore et des Majuscules.
  • enfin les détails


Dans la classe Log, j'ai ajouté une propriété de type string nommée Module.

La méthode Parse est modifiée comme suit
		        public static Log Parse(string Ligne)
        {
            //utilisation d'un regex pour tester le format et faire un premier découpage de la ligne
            Match m = Regex.Match(Ligne, @"^(?<moi>\d\d?)/(?<jour>\d\d?)/(?<annee>\d{4})\s+(?<heure>\d\d?):(?<minute>\d\d?):(?<seconde>\d\d?)\s+(?<ampm>[AP]M):(?<ms>\d{1,3})?\s+(?<module>.+?)\s+(?<erreur>[A-Z]_[A-Z]+)\s+(?<details>.+)$");
            if (m.Success)
            {
                //il faut découper les valeurs de datation, car DateTime.Parse n'aime le jours, mois, heures, minutes, secondes sur 1 chiffe
                int jour = int.Parse(m.Groups["jour"].Value);
                int moi = int.Parse(m.Groups["moi"].Value);
                int annee = int.Parse(m.Groups["annee"].Value);
                int heure = int.Parse(m.Groups["heure"].Value);
                int minute = int.Parse(m.Groups["minute"].Value);
                int secondes = int.Parse(m.Groups["seconde"].Value);

                //si ce nombre est bien des ms, alors 47 venant après 466 dans l'exemple 47 vaut 470, par extension 5 vaudrait 500
                string MS = m.Groups["ms"].Value;
                int ms = 0;
                if (!string.IsNullOrWhiteSpace(MS))
                {
                    ms = int.Parse(MS);
                    if (MS.Length == 1)
                        ms *= 100;
                    else if (MS.Length == 2)
                        ms *= 10;
                }

                DateTime date = new DateTime(annee, moi, jour, heure, minute, secondes, ms);

                //Ajustement AP PM
                if (m.Groups["ampm"].Value == "PM")
                    date = date.AddHours(12);

                return new Log
                {
                    Datation = date,
                    Module = m.Groups["module"].Value,
                    Erreur = m.Groups["erreur"].Value,
                    Details = m.Groups["details"].Value
                };
            }

            return null;//renvoie un Log null quand on n'arrive pas à lire la ligne.
        }


Au lieu de générer une erreur, elle retourne une instance null.

La méthode ChargeFichier du formulaire est modifiée comme suit
        private void ChargerFichier()
        {
            string[] lignes = File.ReadAllLines("test.txt");//chaque ligne est chargée dans un emplacement de tableau

            foreach(string l in lignes)//on itère le tableau pour créer la liste de logs
            {
                Log leLog = Log.Parse(l);
                if (leLog != null)
                    lesLogs.Add(leLog);
                else
                    File.AppendAllText("LignesEnErreur.txt", l);//écrit les lignes rejetées dans le fichier LignesEnErreur.txt
            }
        }


Si ça s'exécute sans planter, va voir dans le répertoire Debug, si le fichier de lignes rejetées a été créé.
Si oui, copie le contenu ici.
Si le contenu est gros, essaye de trouver les "formats" de ligne principaux.
1
Le programme ce lance mais aucune ligne ne s'affiche et dans dans le debug rien de bien utile appart le .exe et le xml config, pour le ms il dépend des lignes ou il est présent et il aura toujours la même forme mais il y a souvent des logs récurent ce que j'aimerai faire c'est, avec une des checkbox dans une autre forme je les coches je gardes en mémoire le fait qu'ils ait été coché et après si tel ou tel check box à été cocher bah je n'affiche que les logs en conséquence, désoler je suis très brouillon et je ne sais pas réelment expliquer en tout cas je te remercie énormément pour le temps que tu y consacre.
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
6 févr. 2020 à 16:10
Ok, je le récupère ce soir
1
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
7 févr. 2020 à 09:06
Alors, je pense que tu n’avais pas abonné les événements ValueChanged des DateTimePicker et SelectedIndexChanged aux méthodes idoines.

Au risque de me répéter. Prendre 3 ou 4 jours pour apprendre les bases te ferait gagner beaucoup de temps à l’avenir.
Là une journée de perdue.
1
DragZ_
Messages postés
6
Date d'inscription
jeudi 6 février 2020
Statut
Membre
Dernière intervention
7 février 2020

7 févr. 2020 à 09:08
Oui c'est clair ta totalement raison mais j'ai avancer sur autre chose donc je n'ai pas perdu mon temps merci beaucoup en tout cas j'ai du pain sur la planche !
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
3 févr. 2020 à 21:42
Bonsoir

Tu parles de date à sélectionner, il faut donc que tu « découpes » ton fichier log pour en extraire les événements avec leur date.

Il y a plusieurs façons de faire et le choix dépend entre autre du formatage du fichier.
Peux tu en poster un extrait (sans données confidentielles bien sûr).

Le site supprime les espaces « en trop », il faut donc utiliser les balises de code, voir un tuto ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Merci aussi de préciser si ton interface est winform ou WPF.

Enfin, concernant ton intervention sur une discussion concernant les richtextbox. A l’époque Coq avait pris la peine de poster 2 liens en fin de message, tu devrais les lire.
0
JeuDuTaquin
Messages postés
221
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
28 avril 2022
7
4 févr. 2020 à 02:28
Salut,
Par curiosité, et pour passer le temps avant la suite…
Le RichTextBox a-t-il une limitation de taille, comme le Textbox classique, limité à 32 767‬ caractères?
Car ici, je voie… "trop volumineux"
Merci d'avance pour la réponse qui me rendra moins bête...
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596 > JeuDuTaquin
Messages postés
221
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
28 avril 2022

4 févr. 2020 à 06:46
Bonjour
Je ne sais pas, c’est un contrôle dont je ne me sers pas.
Par contre, je sais qu il y a des différences entre celui pour winform et celui pour WPF.

Quoiqu’il en soit, si le fichier est si volumineux, aucun contrôle ne permettra de l’afficher entier de façon lisible. Il faudra segmenter, soit le contrôle le fait, soit le codeur le gère.
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022

Modifié le 4 févr. 2020 à 15:05
Bonjour
La taille maximale en caractères pour une RichTextbox est égale à
int MaxValue = 2147483647

Maintenant concernant le problème de DragZ il faut tout d'abord créer à partir du fichier complet une List<String> qui représente toutes les lignes de ce fichier .
Ensuite dans une RichTextbox sans Scrollbar il faut afficher un nombre fixe de lignes (disons 20 lignes) de la ligne 0 à 19 . Ensuite une Scrollbar collée à côté de la RichTextbox permet de naviguer dans la List<String> des lignes du fichier et d'afficher 20 lignes du fichier à partir d'une ligne numéro N quelconque . La RichTextbox n'affiche dans tous les cas qu'au maximum 20 lignes .
Pour afficher les lignes contenant une information précise ( la date dont parle DragZ ) il faut procéder de la même manière en mettant dans une List<String> les lignes contenant cette information et en les affichant ensuite de la même façon que le fichier entier .
Pour la ScrollBar si le contrôle classique de Visual Studio n'a pas une plage assez importante on peut se servir de cette source https://codes-sources.commentcamarche.net/source/102656-controle-utilisateur-scrollbar
J'ai mis en œuvre cette technique dans cette source https://codes-sources.commentcamarche.net/source/102800-acces-direct-disques-et-partitions-en-c-2019 et j'affiche dans une RichTextbox le fichier ISO d'installation de Windows 10 au format Hexa-Ascii qui fait plus de 4 GigaOctets sans aucun souci .
Par contre cela demande pas mal de code et j'attends de voir ce que me répondra DragZ pour envisager la suite
0
DragZ > vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022

Modifié le 4 févr. 2020 à 16:02
J'arrive à afficher comme je le souhaite ce qu'il me manque c'est une des checkbox qui permettent de mettre une valeur pour un contain , ce qui me bloque c'est le fait d'avoir plusieur contain en une seul fois
 if (line.Contains(CODE_KO_Contain, CODE_OK_Contain)) 
mais ça ne fonctionne pas
0
vb95
Messages postés
2630
Date d'inscription
samedi 11 janvier 2014
Statut
Modérateur
Dernière intervention
19 mai 2022
151 > DragZ
4 févr. 2020 à 16:19
Bonjour
if (line.Contains(CODE_KO_Contain, CODE_OK_Contain)) 
ne fonctionne pas
mais ceci fonctionnera
if (line.Contains(CODE_KO_Contain) && line.Contains(CODE_OK_Contain)) 
                          {
                                  // Code à mettre dans le if
                          }


Le && est la fonction AND ( ET logique ) mais si la première condition est fausse elle n'évalue pas la seconde alors que

if (line.Contains(CODE_KO_Contain) & line.Contains(CODE_OK_Contain)) 
                          {
                                  // Code à mettre dans le if
                          }

Dans ce second cas ( un seul & ) les 2 conditions sont toujours évaluées
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
4 févr. 2020 à 12:01
800k lignes c’est aberrant.....
Oui là il est evident qu’il faut faire de la lecture ciblée.

Peux tu poster quelques lignes qu’on voit le formalisme
0
j'ai réussi à ne pas faire planter en faisant ça
  void LectureHeure()
        {
            richTextBox1.Show();
            using (FileStream fs = File.Open(ofd1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
               using (BufferedStream bs = new BufferedStream(fs))
                {
                    using (StreamReader sr = new StreamReader(bs))
                    {
                        string line;
                        while((line = sr.ReadLine()) != null)
                        {
                            if (line.Contains("CODE_KO"))
                            this.richTextBox1.AppendText(line+"\r\n");
                        }
                    }
                }
            }
        }

ça fontionne étonnament assez bien quand je cherche à n'afficher que ce que je souhaite (ce qui est le but) et pour le nombre de ligne malheureusement ce sont des logs donc c'est pas moi qui décident ^^
0
1/30/2020 4:03:51 PM:357 PLC_T12 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 712121
1/30/2020 4:03:51 PM:359 PLC_T13 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 713121
1/30/2020 4:03:51 PM:361 PLC_T12 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 712122
1/30/2020 4:03:51 PM:363 PLC_T13 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 713122
1/30/2020 4:03:51 PM:366 Gestionnaire attribution C_BEGIN GestRegle::executeRegle [L:747] lancement de l'exécution règle n°1
1/30/2020 4:03:51 PM:366 Gestionnaire attribution C_BEGIN RegleStdMission::execute [L:389] Exécution règle standard mission n°1: Mission dédiée
1/30/2020 4:03:51 PM:366 Gestionnaire attribution C_BEGIN RegleStd::evalue [L:198] Evaluation règle standard n°1: Mission dédiée
1/30/2020 4:03:51 PM:366 Gestionnaire attribution C_BEGIN RegleStd::evalueParametre [L:313] Evalue le paramètre règle: Agv pour l'agv n°16
1/30/2020 4:03:51 PM:366 Gestionnaire attribution C_END RegleStd::evalueParametre [L:324] Code de retour: CODE_OK
1/30/2020 4:03:51 PM:366 Gestionnaire attribution C_END RegleStd::evalue [L:295] Code de retour: CODE_OK
1/30/2020 4:03:51 PM:366 Gestionnaire attribution C_CALL RegleStdMission::execute [L:400] Appel à la procédure stockée: PROC_EXECUTIONREGLEMISSION
1/30/2020 4:03:51 PM:367 Gestionnaire attribution C_END RegleStdMission::execute [L:426] Code de retour: CODE_OK
1/30/2020 4:03:51 PM:367 Gestionnaire attribution C_END GestRegle::executeRegle [L:757] Code de retour: CODE_OK
1/30/2020 4:03:51 PM:372 PLC_T12 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 712124
1/30/2020 4:03:51 PM:374 PLC_T13 N_ERREUR InterfaceOPCPhysique::WriteItem [L:475] IID_IOPCSyncIO::Write failed : 713124
1/30/2020 4:03:51 PM:414 Gestionnaire Attribution C_SPY AbonneSql::traiteMessage [L:879] Traitement message MessageEvtDeclenchementHorloge(107) n°573 : 0 ms
1/30/2020 4:03:51 PM:432 Gestionnaire Attribution C_SPY AbonneSql::traiteMessage [L:879] Traitement message MessageEvtDeclenchementHorloge(107) n°574 : 0 ms
1/30/2020 4:03:52 PM:47 PORTE_BVL N_WARNING InterfaceOPCPhysique::WriteItem [L:480] Unknown item 90100
0
C'est ce qui ce passe souvent
0
JeuDuTaquin
Messages postés
221
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
28 avril 2022
7
4 févr. 2020 à 16:01
Salut,
Effectivement, c'est l'horreur de traiter de tels fichiers.
A part le streaming en splittant le fichier pour accélérer le traitement… la redondance de lignes à analyser bloque la machine de longues minutes.
Mais si l'on considère que le log est chronologique, on peut envisager la lectures des lignes à rebours et ne tester que quelques caractères (années/mois/jour).
Ce qui est possible, aussi, est de faire une classe datte, et de ne charger que ces dates avec comme index, les numéros de lignes.
On charge les lignes de date à la demande… par index de lignes.

Merci pour la réponse collégiale au sujet de la taille des richboxs.
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
4 févr. 2020 à 16:04
Ok, c’est un formatage simple.

Pour moi, le richtextbox n’est pas adapté, certes il te permet d’afficher un texte long, de colorer, souligner ou mettre en gras les parties de texte que tu veux, mais est ce pertinent.
Dans 800k lignes tu ne vas pas facilement trouver l’info qui t’intéresse.

On voit que chaque ligne commence par la date, puis il y a un entier, supposons que ce soit une catégorie, et enfin des détails.

Si je te propose une interface dans laquelle tu peux choisir une date, en fonction ça te liste toutes les « catégories », tu choisis celle qui te convient et là ça affiche les détails concernés.
Est ce qu’un truc comme ça te conviendrait.

nombre de ligne malheureusement ce sont des logs donc c'est pas moi qui décident ^^
Ha si tu peux, tu peux choisir, une fois par semaine (ou plus ou moins si besoin) de sauvegarde le log, afin d’avoir une collection de fichiers plus petits.
Tu peux aussi choisir de supprimer les lignes (ou fichiers) trop vielles.
Est ce pertinent de garder ce qui a 1 moi, 6 mois, 1 an, 5 ans ect...
0
En parlant de décidé les logs sont fait à la journée la date est subjective du coup ce qui m'intéresse c'est principalement les heures et certaines erreurs je suis passer sur une textbox basique.
Et oui c'est la visée de mon outil récupéré différente partie des logs en fonction de la demande j'apprend le c# sur le tas donc ça demande de la patiente ^^
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
5 févr. 2020 à 09:45
J’ai pris un datagridview pour la présentation en colonne.
C’est plus lisible qu’un textbox ou même un richtextbox avec de la couleur.
Mais on peut utiliser à peu près n’importe quel contrôle.

En plus
le seul soucis c'est qu'il ce passe dans un DataGridView je voulais savoir si c'était possible dans un textBox ou bien uniquement en datagridview,
c’est un peu contradictoire.

Peux tu mieux expliquer ton besoin?

Là, pour l’instant, je t’ai proposé une solution qui répond au besoin
  • sélection d’une plage horaire
  • sélection d’une erreur (enfin si j’ai bien découpé l’erreur)




0
En faite je n'est pas que la plage horraire j'ai par exemple à affcher les lignes quand le fichier log contient "N_ERREUR" fin j'ai plusieurs choix qui s'offre à moi, la manière dont je veux choisir c(est avec une checkbox je séléctionne et ça affiche en fonction des cases cochers
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
Modifié le 5 févr. 2020 à 11:00
Ok, mais si une erreur que tu n’avais pas prévu apparaît.
Là tu les as toutes celles qui sont présentes, dans la plage horaire (plage qui peut-être le fichier entier).

Pour l’instant j’ai pas super bien géré les millisecondes (si les entiers après PM sont bien les millisecondes). Donc si la datation précise est importante pour toi, il faudra améliorer un peu.

De même, ce que j’ai interprété comme l’erreur => après les millisecondes jusqu’à :: n’est p’tet pas ce que tu cherches.
Et puis, il te seras peut-être utile de découper les ligne en 4, 5 ou plus plutôt qu’en 3.

Bref, pour vraiment t’aider, il faut que tu expliques clairement.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
0
Non l'erreur N_ERREUR est dans le fichier log, l'erreur est au lancement du programme et c'est la ligne qui est censer gérer l'exception
throw new Exception("Format de ligne non reconnu");
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
5 févr. 2020 à 11:03
Ha j’ai modifié mon texte le pendant que tu répondais.

Si tu as un arrêt sur
 throw new Exception("Format de ligne non reconnu");
copie colle le contenu de la variable Ligne

0
Match m = Regex.Match(Ligne, @"^(?<mois>\d\d?)/(?<jour>\d\d?)/(?<annee>\d{4})\s+(?<heure>\d\d?):(?<minute>\d\d?):(?<seconde>\d\d?)\s+(?<ampm>[AP]M):(?<ms>\d{1,3})\s+(?<erreur>.+?)::(?<details>.+)$");

cette ligne ? j'ai supprimer ms qui n'est pas récurent après chaque ligne est différente selon le type d'erreur ou de retour réalisé
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
5 févr. 2020 à 11:34
Non, pas la ligne de code, le contenu de la variable.

Si tu ne sais pas utiliser les outils de déboggage, tu ne pourras pas coder correctement.
Voilà un petit tuto https://openclassrooms.com/fr/courses/1526901-apprenez-a-developper-en-c/2867766-utilisez-le-debogueur/

Supprimer ms n’est pas pertinent, car ça va planter quand c’est présent. Il faut gérer les cas où c’est absent.
Mais pour ça, j’ai besoin de la ligne de ton fichier incriminée
0
des que mon code atteint m.success(donc il ne rentre pas dans la boucle) il arrive à l'exception je comprend pas trop ce que je dois faire désoler ^^'
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
5 févr. 2020 à 11:54
Lit le tuto
0
Je vien de jouer le debugueur le soucis est la première qui a un drole de format "1/30/2020 4:01:27 PM:359 LOGMON C_INFO WinMain [L:40] ============================================================" avec le debugueur on vois bien qu'il detecte toute les lignes pas de soucis mais le format de la première ligne ne lui plait pas
1/30/2020 4:01:27 PM:359 LOGMON C_INFO WinMain [L:40] ============================================================
1/30/2020 4:01:27 PM:359 LOGMON C_INFO WinMain [L:41] Starting le nom du service
1/30/2020 4:01:27 PM:359 LOGMON C_INFO WinMain [L:42] ============================================================
cette écriture est récurante au lancement ou à l'arrêt d'un service utiliser
0
JeuDuTaquin
Messages postés
221
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
28 avril 2022
7 > DragZ
Modifié le 5 févr. 2020 à 15:30
Salut,
Cela peut s'expliquer par le header d'identification de type de ficher texte. Contrairement à ce que le bon vieux DOS nous a habitué, un fichier texte sous windows possède une entête binaire de trois caractères. Cet entête détermine le type d'encodage utilisé par l'application d'origine… UTF8, UTF16, Unicode…
Donc, si tu extrais le binaire, une fois converti en ASCII, il y aura un artéfact non ASCII en début de ligne. Ce code est lu automatiquement dans les applications du type Bloc-note, et est retiré de facto, mais en extraction direct, ce code provoque parfois des problèmes.
Regarde les premiers codes binaires "EFBBBF" en UTF8, au début de ton fichier log...
On peut le retirer sans problème, mais l'affichage peut être corrompu avec certaines applications..
0
DragZ > JeuDuTaquin
Messages postés
221
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
28 avril 2022

5 févr. 2020 à 15:19
Waw alors la excuse moi j'ai pas tout suivi mais pourquoi du coter de Whismeril ça fonctionnerai et pas du mien ?
0
JeuDuTaquin
Messages postés
221
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
28 avril 2022
7 > DragZ
Modifié le 5 févr. 2020 à 15:29
Cela s'explique simplement car Whismeril a créer un fichier texte sans header avec un éditeur texte (copier/coller)… Sur Edit+, par exemple, si tu spécifies un encodage UTF8 et que tu l'enregistres, tu retrouvera le même problème avec une erreur à la première ligne.
0
DragZ > JeuDuTaquin
Messages postés
221
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
28 avril 2022

5 févr. 2020 à 15:31
D'accord donc selon toi ça viens de l'encodage ?
0
Oui encore désoler pour la tournure de cette discussion et pour l'utilisation du débogueur maintenant je sais m'en servir du coup point positif de ce bazar bah il me forme ^^ après j'espère que d'autre personne passeront par la pour pouvoir à leur tour avoir l'aide nécessaire sur ce sujet
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
6 févr. 2020 à 10:20
Rien ne s’affiche dans la listbox ou dans le datagridview ou dans les 2?
0
les deux
0
Whismeril
Messages postés
17336
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
20 mai 2022
596
6 févr. 2020 à 11:13
Ok, je te pose plusieurs questions d’un coup, ca évitera le ping pong
  • y’a t creation du fichier LignesEnErreur.txt dans le répertoire de l’exe?
  • si oui et à condition qu’il ne fasse pas 6Go, peux tu copier coller les premier ligne, en mettant les balises de codes en xml (ça va conserver les tabulations, espaces en double ect...)



Dans un second temps, ajoute un messagebox, dans ChargerFichier
        private void ChargerFichier()
        {
            string[] lignes = File.ReadAllLines("test.txt");//chaque ligne est chargée dans un emplacement de tableau

            foreach(string l in lignes)//on itère le tableau pour créer la liste de logs
            {
                Log leLog = Log.Parse(l);
                if (leLog != null)
                    lesLogs.Add(leLog);
                else
                    File.AppendAllText("LignesEnErreur.txt", l);//écrit les lignes rejetées dans le fichier LignesEnErreur.txt
            }
            MessageBox.show("fichier lu");
        }


Et mets un point d’arrêt à cette ligne
      dtpDebut.Value = lesLogs.First().Datation;


Il est possible que ça s’envoie en l’air quelque part à cause d’un dépassement de mémoire (par exemple).
Le messagebox s’il apparaît donnera une indication du chargement du fichier.
Si tu arrives jusqu’à point d’arrêt, alors merci de dire combien il y a d’item dans lesLogs et les valeurs de lesLogs.First().Datation et lesLogs.Last().Datation
0
pas de fichier de ligne en erreur de créé, dans les les logs first il me met le nombre de lignes total (312053) mais aussi à dtpDebut.value({06/02/2020 11:27:16}) donc la date du jour mais quand je passe à dtpFin il prend la valeur de dtpdebut et dtp debut de vient ({30/01/2020 16:01:27}) et le datetimepicker prend la bonne heure de début et de fin du fichier de log
0