using System.Globalization;
using System.Text.RegularExpressions;
public static void Main()
var folder = new DirectoryInfo(@"\");
folder.CreateSubdirectory(@"Writer");
folder.CreateSubdirectory(@"Incorrect");
catch (IOException e) { Console.WriteLine(e.Message); }
var totalTime = TimeSpan.Zero;
from line in File.ReadAllLines(@"text.txt")
where Regex.IsMatch(line, @"\d{3},\d{2},\d{3}\,\d{2}/\d{2}/\d{2} \d{2}:\d{2},\d{2,}:\d{2}:\d{2},\d{2},\d{2},\d{2},.+")
let lineAttr = line.Split(',')
let timeSpanAttr = lineAttr[4].Split(':')
let timeSpan = new TimeSpan(int.Parse(timeSpanAttr[0]), int.Parse(timeSpanAttr[1]), int.Parse(timeSpanAttr[2]))
NodeNumber = lineAttr[1],
StatusCode = lineAttr[2],
Date = DateTime.Parse(lineAttr[3], new DateTimeFormatInfo { FullDateTimePattern = "DD/MM/YYYY HH:MM" }),
TotalTime = (totalTime += timeSpan),
Description = lineAttr[8]
var validStatusCode = new[] { "Jam", "Rt" };
where !validStatusCode.Any(record.StatusCode.Contains)
group record by new { record.NodeNumber, record.StatusCode } into grouping
orderby grouping.Key.NodeNumber, grouping.Key.StatusCode
select new { grouping.Key.NodeNumber, grouping.Key.StatusCode, Count = grouping.Count() }
var invalidRecords = records.Where(record => record.TimeSpan.TotalHours > 2).ToList();
var totalInvalidTime = TimeSpan.FromSeconds(invalidRecords.Sum(record => record.TimeSpan.TotalSeconds));
var totalValidTime = totalTime - totalInvalidTime;
var validRecordsCount = records.Count - invalidRecords.Count;
var avgValidTime = TimeSpan.FromSeconds(totalValidTime.TotalSeconds / validRecordsCount);
group record by new { record.NodeNumber, record.StatusCode }
Count = grouping.Count(),
TotalNodeTime = TimeSpan.FromSeconds(grouping.Sum(rec => rec.TimeSpan.TotalSeconds))
using (var writer = new StreamWriter(@"Writer\Write.txt"))
records.ForEach(record => writer.WriteLine("{0} Текущее время = {1} Общее время = {2}", record.Id, record.TimeSpan, record.TotalTime));
writer.WriteLine("\n\n Всё время отклонения = {0} в секундах = {1}", totalTime, totalTime.TotalSeconds);
writer.WriteLine(" Среднее время {0:hh\\:mm\\:ss};", avgValidTime);
totalByNode.ForEach(record =>
var text = string.Format("Узел {1}: {0}", record.NodeNumber, record.Count);
Console.WriteLine("{0}\t\t {1}\t \t{2}", "Код узла", "Код ошибки", "Число ошибок");
writer.WriteLine("{0}\t\t {1}\t \t{2}", "Код узла", "Код ошибки", "Число ошибок");
errorsCount.ForEach(record =>
var text = string.Format("{0}\t\t\t {1}\t\t \t{2}", record.NodeNumber, record.StatusCode, record.Count);
Console.WriteLine("\nСреднее время обработки отклонения = {0:hh\\:mm\\:ss};", avgValidTime);
totalByNode.ForEach(record => Console.WriteLine("{0}, {1}, {2}, {3}", record.NodeNumber, record.StatusCode, record.TotalNodeTime, TimeSpan.FromSeconds(record.TotalNodeTime.TotalSeconds / record.Count)));