Fichier .txt volumineux [Résolu]

Signaler
-
Messages postés
6
Date d'inscription
jeudi 6 février 2020
Statut
Membre
Dernière intervention
7 février 2020
-
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

Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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.

Je te remercie c'est vraiment génial les gens comme toi qui prennent le temps d'aider merci beaucoup !
Messages postés
2236
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
21 septembre 2020
114
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 .
Je regarde pas mal a ton code j'aimerai savoir à quoi te sert le menu strip à la différence du opfd?
Messages postés
2236
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
21 septembre 2020
114 > DragZ
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 .
Apparement 6GO la lecture n'est pas passez xD
Messages postés
2236
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
21 septembre 2020
114 > DragZ
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
>
Messages postés
2236
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
21 septembre 2020

Nan mais c'était juste pour tester les limites ne je nais pas au delà de quelque ki
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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
        }
    }
}
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 !
Des que je lance l'app il me ramène directement à la ligne d'exception sans trop comprendre pourquoi...
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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
>
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020

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
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433 >
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020

Et aussi, quand il n’y a pas de millisecondes, y a t il les : après PM?
>
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020

Après le PM il ya la provenance du log et le type du log donc N_ERREUR ect...
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433 >
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020

mais j'aimerai bien avoir les mêmes compétence

Y’a pas de miracle, apprendre correctement les bases, notamment grâce au cours de Tahé que je t’ai mis en lien plus haut.
Et ensuite coder, coder, coder et encore coder
>
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020

Ouais c'est ça après je suis en alternance donc je décroche du c# pour repartir sur du c++ python quand je suis en cours donc ça aide pas
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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.
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.
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
Ok, je le récupère ce soir
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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.
Messages postés
6
Date d'inscription
jeudi 6 février 2020
Statut
Membre
Dernière intervention
7 février 2020

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 !
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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.
Messages postés
2236
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
21 septembre 2020
114 > DragZ
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
>
Messages postés
2236
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
21 septembre 2020

Super merci ça fonctionne !
Messages postés
2236
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
21 septembre 2020
114 > DragZ
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 .
>
Messages postés
185
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 septembre 2020

Ha je savais pas que la textbox avais une limite j'ai 800K ligne dans certain fichier donc pour afficher ça dois être normal que l'app ce stop bon à savoir le richtext box lui va jusqu'à 64Ko caractère.
void LectureHeure()
        {
            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)
                        {
                            // et la je veux rejoindre une autre classe qui va me permettre de choisir d'afficher avec une heure choisi
                           // ou autre si possible dans une textbox pour que je puisse l'afficher de manière lisible
                        }
                    }
                }
            }
        }

Déja merci de ta réponse j'ai fait des test d'écrire tout mon fichier dans une console j'ai d'abord essayer de mettre chaque ligne dans un tableau qui génère ça taille en fonction de la ligne et j'ai vu que c'était nettement plus couteux en ressource plutot que de juste prendre la ligne et de l'afficher 250 mo contre 12 mo et je suis en windform pour information
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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
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 ^^
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
C'est ce qui ce passe souvent
Messages postés
185
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 septembre 2020
5
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.
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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...
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 ^^
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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)




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
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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
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");
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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

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é
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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
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 ^^'
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
Lit le tuto
>
Messages postés
185
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 septembre 2020

Waw alors la excuse moi j'ai pas tout suivi mais pourquoi du coter de Whismeril ça fonctionnerai et pas du mien ?
Messages postés
185
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 septembre 2020
5 > DragZ
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.
>
Messages postés
185
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 septembre 2020

D'accord donc selon toi ça viens de l'encodage ?
Messages postés
185
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 septembre 2020
5 > DragZ
Salut,
Ce n'est qu'une hypothèse que tu pourras valider avec un éditeur binaire.
En théorie, ce header peut être retiré, mais cela dépend du mode d'accès de l'application sur ton log. Tu auras peut-être une restriction d'accès s'il est ouvert au moment de la modification.
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433 >
Messages postés
185
Date d'inscription
mardi 4 juillet 2017
Statut
Membre
Dernière intervention
21 septembre 2020

Alors c'est vrai qu'avec les commentaires dans tous les sens cette discussion est un peu en bazar, mais je répète que non ça n'a rien à voir avec l'encodage.

Je l'ai dit au message 21, j'ai volontairement généré une erreur quand la ligne est rejetée par la regex. Le but étant de récupérer les lignes qui ne correspondent pas au format montré en exemple et d'adapter la regex en fonction.

Mais, je n'ai sans doute pas été assez explicite, et DragZ ne savait pas encore bien se servir du déboggeur, ça a pris une bonne partie de la journée.
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
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
Rien ne s’affiche dans la listbox ou dans le datagridview ou dans les 2?
Messages postés
14774
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
22 septembre 2020
433
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
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