public static Timetable MergeToTimetable(Timetable t, TimetableAcademicYear d) { //adding event to the timetable tree if (t.AcademicYears.Exists(e => e.AcademicYear == d.AcademicYear)) { TimetableAcademicYear nextLayerTimetable = t[d.AcademicYear].First(); TimetableDepartment nextLayerK0 = d.Departments[0]; if (nextLayerTimetable.Departments.Exists(e => e.Department == nextLayerK0.Department)) { TimetableDepartment nextLayerTimetable1 = nextLayerTimetable[nextLayerK0.Department].First(); TimetableMode nextLayerK1 = nextLayerK0.Modes[0]; if (nextLayerTimetable1.Modes.Exists(e => e.Mode == nextLayerK1.Mode)) { TimetableMode nextLayerTimetable2 = nextLayerTimetable1[nextLayerK1.Mode].First(); TimetableField nextLayerK2 = nextLayerK1.Fields[0]; if (nextLayerTimetable2.Fields.Exists(e => e.FieldOfStudy == nextLayerK2.FieldOfStudy)) { TimetableField nextLayerTimetable3 = nextLayerTimetable2[nextLayerK2.FieldOfStudy].First(); TimetableSemester nextLayerK3 = nextLayerK2.Semesters[0]; if (nextLayerTimetable3.Semesters.Exists(e => e.Semester == nextLayerK3.Semester && e.Degree == nextLayerK3.Degree)) { TimetableSemester nextLayerTimetable4 = nextLayerTimetable3[nextLayerK3.Semester, nextLayerK3.Degree, nextLayerK3.Year].First(); TimetableDay nextLayerK4 = nextLayerK3.Days[0]; if (nextLayerTimetable4.Days.Exists(e => e.DayOfWeek == nextLayerK4.DayOfWeek)) { //TimetableDay nextLayerTimetable5 = nextLayerTimetable4[nextLayerK4.DayOfWeek].First(); //nextLayerTimetable5.Events.AddRange(nextLayerK4.Events); TimetableDay nextLayerTimetable5 = nextLayerTimetable4[nextLayerK4.DayOfWeek].First(); TimetableEvent nextLayerK5 = nextLayerK4.Events[0]; if (nextLayerTimetable5.Events.Any(e => e.EqualsExceptGroups(nextLayerK5))) { TimetableEvent nextLayerTimetable6 = nextLayerTimetable5.Events.Find(e => e.EqualsExceptGroups(nextLayerK5)); nextLayerTimetable6.Groups = nextLayerTimetable6.Groups.Union(nextLayerK5.Groups).ToList(); nextLayerTimetable6.FacultyGroups = nextLayerTimetable6.FacultyGroups.Union(nextLayerK5.FacultyGroups).ToList(); } else { nextLayerTimetable5.Events.Add(nextLayerK5); } } else { nextLayerTimetable4.Days.Add(nextLayerK4); } } else { nextLayerTimetable3.Semesters.Add(nextLayerK3); } } else { nextLayerTimetable2.Fields.Add(nextLayerK2); } } else { nextLayerTimetable1.Modes.Add(nextLayerK1); } } else { nextLayerTimetable.Departments.Add(nextLayerK0); } } else { t.AcademicYears.Add(d); } return(t); }
public static Timetable ParseTimetableFiles(IEnumerable <string> filesContents, DateTime date) { string[] dni = { "PN", "WT", "ŚR", "CZW", "PT", "SO", "NIE" }; Timetable timetable = new Timetable() { Date = date }; foreach (var content in filesContents) { var lines = Regex.Split(content, Environment.NewLine); Dictionary <string, string> groups = new Dictionary <string, string>(); Dictionary <string, string> degrees = TimetableOLD.Models.Dictionaries.DegreesDictionary2; TimetableInfo currentInfo = new TimetableInfo(); for (int i = 0; i < lines.Length; i++) { if (lines[i].ToUpper().Trim() == "GROUPS") { string[] grs = lines.Skip(i + 1).TakeWhile(l => l.ToLower().Trim() != "end_groups.").ToArray(); foreach (var gr in grs) { string[] g = gr.Split(';'); if (!groups.ContainsKey(g[0].Trim())) { groups.Add(g[0].Trim(), g.Length > 1 ? g[1].Trim() : ""); } } i += grs.Length + 1; } else if (lines[i].ToUpper().Trim() == "INFO") { string[] infoLines = lines.Skip(i + 1).TakeWhile(l => l.ToLower().Trim() != "end_info.").ToArray(); string[] infos = infoLines[0].Split(';'); currentInfo = new TimetableInfo() { AcademicYear = infos[0].Trim(), Department = infos[1].Trim(), Mode = infos[2].Trim(), Field = infos[3].Trim(), Degree = degrees.ContainsKey(infos[4].Trim().ToUpper()) ? degrees[infos[4].Trim().ToUpper()] : infos[4].Trim(), Semester = Convert.ToInt32(infos[5].Trim()), Year = Convert.ToInt32(infos[6].Trim()), }; i += infoLines.Length + 1; } else if (dni.Contains(lines[i].ToUpper().Trim())) { DayOfWeek day = 0; for (int j = 0; j < dni.Length; j++) { if (lines[i].ToUpper().Trim() == dni[j]) { day = (DayOfWeek)j; } } string[] dayLines = lines.Skip(i + 1).TakeWhile(l => l.ToLower().Trim() != "end_day.").ToArray(); for (int j = 0; j < dayLines.Length;) { string[] eventLines = lines.Skip(i + j + 1).TakeWhile(l => l.ToLower().Trim() != "end_event.").ToArray(); string name, type, room, building, remarks; List <string> lecturers = new List <string>(), facultyGroups = new List <string>(); List <string> groupsNrs = new List <string>(); DateTime startTime, endTime; name = eventLines[0].Split(';')[0].Trim(); try { type = eventLines[0].Split(';')[1].Trim(); } catch (Exception ex) { type = "?"; } //TODO: add facultygroups foreach (string s in eventLines[1].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) { groupsNrs.Add(s.Trim()); } List <TimetableGroup> eventGroups = new List <TimetableGroup>(); foreach (var item in groupsNrs) { eventGroups.Add(new TimetableGroup() { Group = item, Specialization = groups.ContainsKey(item) ? groups[item] : "" }); } startTime = DateTime.ParseExact(eventLines[2].Split('-')[0], new[] { "HH:mm", "H:mm" }, null, DateTimeStyles.AllowWhiteSpaces); endTime = DateTime.ParseExact(eventLines[2].Split('-')[1], new[] { "HH:mm", "H:mm" }, null, DateTimeStyles.AllowWhiteSpaces); string[] where = eventLines[3].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); room = where.Length > 0 ? where[0].Trim() : ""; building = where.Length > 1 ? where[1].Trim() : ""; foreach (string l in eventLines[4].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) { lecturers.Add(l.Trim()); } remarks = eventLines[5].Trim(); TimetableEvent ev = new TimetableEvent() { Name = name, Type = type, Groups = eventGroups, FacultyGroups = new List <string>(), StartTime = startTime, EndTime = endTime, Room = room, Building = building, Lecturers = lecturers, Remarks = remarks }; TimetableAcademicYear k = MakeTimetableAcademicYear(currentInfo.AcademicYear, currentInfo.Department, currentInfo.Mode, currentInfo.Field, currentInfo.Semester, currentInfo.Degree, currentInfo.Year, day, ev); MergeToTimetable(timetable, k); j += eventLines.Length + 1; } } } } //sorting all events SortTimetable(timetable); return(timetable); }