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.
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"); } } }
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 } } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionpublic 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. }
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 } }
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 } } } } }
int MaxValue = 2147483647
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"); } } } } }
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.
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.
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>.+)$");
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"); }
dtpDebut.Value = lesLogs.First().Datation;
4 févr. 2020 à 16:52