public static void DetectSeparator() { using (var file = new TestFile(";")) { var tr = new TimetableReader(file.FileName); Assert.Single(tr.Strings); Assert.Equal(2, tr.Strings[0].Length); } using (var file = new TestFile(",")) { var tr = new TimetableReader(file.FileName); Assert.Single(tr.Strings); Assert.Equal(2, tr.Strings[0].Length); } using (var file = new TestFile("\t")) { var tr = new TimetableReader(file.FileName); Assert.Single(tr.Strings); Assert.Equal(2, tr.Strings[0].Length); } using (var file = new TestFile(":")) { Assert.Throws <InvalidDataException>(() => { var tr = new TimetableReader(file.FileName); }); } }
public void DetectSeparatorTest() { using (var file = new TestFile(";")) { var tr = new TimetableReader(file.FileName); Assert.AreEqual(1, tr.Strings.Count); Assert.AreEqual(2, tr.Strings[0].Length); } using (var file = new TestFile(",")) { var tr = new TimetableReader(file.FileName); Assert.AreEqual(1, tr.Strings.Count); Assert.AreEqual(2, tr.Strings[0].Length); } using (var file = new TestFile("\t")) { var tr = new TimetableReader(file.FileName); Assert.AreEqual(1, tr.Strings.Count); Assert.AreEqual(2, tr.Strings[0].Length); } using (var file = new TestFile(":")) { Assert.ThrowsException <InvalidDataException>(() => { var tr = new TimetableReader(file.FileName); }); } }
//================================================================================================// /// <summary> /// Read pool files /// </summary> /// <param name="arguments"></param> /// <param name="cancellation"></param> /// <returns></returns> public Dictionary <string, TimetableTurntablePool> ProcessTurntables(string fileName, CancellationToken cancellationToken) { Dictionary <string, TimetableTurntablePool> turntables = new Dictionary <string, TimetableTurntablePool>(); List <string> filenames; // get filenames to process filenames = GetTurntableFilenames(fileName); // get file contents as strings Trace.Write("\n"); foreach (string filePath in filenames) { // get contents as strings Trace.Write("Turntable File : " + filePath + "\n"); var turntableInfo = new TimetableReader(filePath); // read lines from input until 'Name' definition is found int lineindex = 1; while (lineindex < turntableInfo.Strings.Count) { switch (turntableInfo.Strings[lineindex][0].ToLower().Trim()) { // skip comment case "#comment": lineindex++; break; // process name // do not increase lineindex as that is done in called method case "#name": TimetableTurntablePool newTurntable = new TimetableTurntablePool(turntableInfo, ref lineindex, simulator); // store if valid pool if (!String.IsNullOrEmpty(newTurntable.PoolName)) { if (turntables.ContainsKey(newTurntable.PoolName)) { Trace.TraceWarning("Duplicate turntable defined : " + newTurntable.PoolName); } else { turntables.Add(newTurntable.PoolName, newTurntable); } } break; default: if (!String.IsNullOrEmpty(turntableInfo.Strings[lineindex][0])) { Trace.TraceInformation("Invalid definition in file " + filePath + " at line " + lineindex + " : " + turntableInfo.Strings[lineindex][0].ToLower().Trim() + "\n"); } lineindex++; break; } } } return(turntables); }
/// <summary> /// Try to load the file. /// Possibly this might raise an exception. That exception is not caught here /// </summary> /// <param name="file">The file that needs to be loaded</param> public override void TryLoading(string file) { String extension = Path.GetExtension(file).ToLowerInvariant(); if (extension.Contains("table")) { var timeTableList = new TimetableGroupFile(file); } else { var timeTable = new TimetableReader(file); } }
public void ParseStructureTest() { using (var file = new TestFile(";b;c;d\n1;2;3\nA;B;C;D;E")) { var tr = new TimetableReader(file.FileName); Assert.AreEqual(3, tr.Strings.Count); Assert.AreEqual(4, tr.Strings[0].Length); Assert.AreEqual(3, tr.Strings[1].Length); Assert.AreEqual(5, tr.Strings[2].Length); CollectionAssert.AreEqual(new[] { "", "b", "c", "d" }, tr.Strings[0]); CollectionAssert.AreEqual(new[] { "1", "2", "3" }, tr.Strings[1]); CollectionAssert.AreEqual(new[] { "A", "B", "C", "D", "E" }, tr.Strings[2]); } }
/// <summary> /// Try to load the file. /// Possibly this might raise an exception. That exception is not caught here /// </summary> /// <param name="file">The file that needs to be loaded</param> public override void TryLoading(string file) { #pragma warning disable CA1308 // Normalize strings to uppercase string extension = Path.GetExtension(file).ToLowerInvariant(); #pragma warning restore CA1308 // Normalize strings to uppercase if (extension.Contains("table")) { _ = new TimetableGroupFile(file); } else { _ = new TimetableReader(file); } }
public Activity(Content content) { Debug.Assert(content.Type == ContentType.Activity); if (System.IO.Path.GetExtension(content.PathName).Equals(".act", StringComparison.OrdinalIgnoreCase)) { var file = new ActivityFile(content.PathName); Name = file.Tr_Activity.Tr_Activity_Header.Name; Description = file.Tr_Activity.Tr_Activity_Header.Description; Briefing = file.Tr_Activity.Tr_Activity_Header.Briefing; PlayerServices = new[] { String.Format("Player|{0}", file.Tr_Activity.Tr_Activity_File.Player_Service_Definition.Name) }; if (file.Tr_Activity.Tr_Activity_File.Traffic_Definition != null) { Services = file.Tr_Activity.Tr_Activity_File.Traffic_Definition.ServiceDefinitionList.Select((service, index) => String.Format("AI|{0}|{1}|{2}", service.Name, file.Tr_Activity.Tr_Activity_File.Traffic_Definition.Name, index) ); } else { Services = new string[0]; } } else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase) || System.IO.Path.GetExtension(content.PathName).Equals(".timetable-or", StringComparison.OrdinalIgnoreCase)) { // TODO: Make common timetable parser. var file = new TimetableReader(content.PathName); Name = content.Name; var services = new List <string>(); for (var column = 0; column < file.Strings[0].Length; column++) { if (String.IsNullOrEmpty(file.Strings[0][column]) || file.Strings[0][column].StartsWith("#")) { continue; } services.Add(file.Strings[0][column]); } PlayerServices = services; Services = new string[0]; } }
public Activity(Content content) { Debug.Assert(content.Type == ContentType.Activity); if (System.IO.Path.GetExtension(content.PathName).Equals(".act", StringComparison.OrdinalIgnoreCase)) { var file = new ActivityFile(content.PathName); Name = file.Activity.Header.Name; Description = file.Activity.Header.Description; Briefing = file.Activity.Header.Briefing; PlayerServices = new[] { $"Player|{file.Activity.PlayerServices.Name}" }; if (file.Activity.Traffic != null) { Services = file.Activity.Traffic.Services.Select((service, index) => $"AI|{service.Name}|{file.Activity.Traffic.Name}|{index}" ); } else { Services = Array.Empty <string>(); } } else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase)) { // TODO: Make common timetable parser. var file = new TimetableReader(content.PathName); Name = content.Name; var services = new List <string>(); for (var column = 0; column < file.Strings[0].Length; column++) { if (String.IsNullOrEmpty(file.Strings[0][column]) || file.Strings[0][column].StartsWith("#")) { continue; } services.Add(file.Strings[0][column]); } PlayerServices = services; Services = Array.Empty <string>(); } }
public static void DetectSeparator() { using (var file = new TestFile(";")) { var tr = new TimetableReader(file.FileName); Assert.Equal(1, tr.Strings.Count); Assert.Equal(2, tr.Strings[0].Length); } using (var file = new TestFile(",")) { var tr = new TimetableReader(file.FileName); Assert.Equal(1, tr.Strings.Count); Assert.Equal(2, tr.Strings[0].Length); } using (var file = new TestFile("\t")) { Assert.Throws(typeof(InvalidDataException), () => { var tr = new TimetableReader(file.FileName); }); } }
public void Init() { source = File.ReadAllText(@"name.txt"); timetable = new TimetableReader(source); }
public Service(Content content) { Debug.Assert(content.Type == ContentType.Service); if (System.IO.Path.GetExtension(content.PathName).Equals(".srv", StringComparison.OrdinalIgnoreCase)) { var file = new ServiceFile(content.PathName); Name = file.Name; Consist = file.Train_Config; Path = file.PathID; Debug.Assert(content is ContentMSTSService); var msts = content as ContentMSTSService; var actFile = new ActivityFile(content.Parent.PathName); if (msts.IsPlayer) { var activityTraffic = actFile.Tr_Activity.Tr_Activity_File.Player_Service_Definition.Player_Traffic_Definition; ID = "0"; StartTime = MSTSTimeToDateTime(activityTraffic.Time); Stops = from stop in activityTraffic.Player_Traffic_List select new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(stop.ArrivalTime), MSTSTimeToDateTime(stop.DepartTime)); } else { var trfFile = new TrafficFile(msts.TrafficPathName); var activityService = actFile.Tr_Activity.Tr_Activity_File.Traffic_Definition.ServiceDefinitionList[msts.TrafficIndex]; var trafficService = trfFile.TrafficDefinition.TrafficItems[msts.TrafficIndex]; ID = activityService.UiD.ToString(); StartTime = MSTSTimeToDateTime(activityService.Time); Stops = trafficService.TrafficDetails.Zip(activityService.ServiceList, (tt, stop) => new Stop(stop.PlatformStartID, stop.DistanceDownPath, MSTSTimeToDateTime(tt.ArrivalTime), MSTSTimeToDateTime(tt.DepartTime))); } } else if (System.IO.Path.GetExtension(content.PathName).Equals(".timetable_or", StringComparison.OrdinalIgnoreCase)) { // TODO: Make common timetable parser. var file = new TimetableReader(content.PathName); Name = content.Name; var serviceColumn = -1; var consistRow = -1; var pathRow = -1; var startRow = -1; for (var row = 0; row < file.Strings.Count; row++) { if (file.Strings[row][0] == "#consist" && consistRow == -1) { consistRow = row; } else if (file.Strings[row][0] == "#path" && pathRow == -1) { pathRow = row; } else if (file.Strings[row][0] == "#start" && startRow == -1) { startRow = row; } } for (var column = 0; column < file.Strings[0].Length; column++) { if (file.Strings[0][column] == content.Name && serviceColumn == -1) { serviceColumn = column; } } ID = serviceColumn.ToString(); var timeRE = new Regex(@"^(\d\d):(\d\d)(?:-(\d\d):(\d\d))?"); var startTimeMatch = timeRE.Match(file.Strings[startRow][serviceColumn]); if (startTimeMatch.Success) { StartTime = new DateTime(2000, 1, 1, int.Parse(startTimeMatch.Groups[1].Value), int.Parse(startTimeMatch.Groups[2].Value), 0); } var stops = new List <Stop>(); for (var row = 0; row < file.Strings.Count; row++) { if (row != startRow) { var timeMatch = timeRE.Match(file.Strings[row][serviceColumn]); if (timeMatch.Success) { var arrivalTime = new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[1].Value), int.Parse(timeMatch.Groups[2].Value), 0); var departureTime = timeMatch.Groups[3].Success ? new DateTime(2000, 1, 1, int.Parse(timeMatch.Groups[3].Value), int.Parse(timeMatch.Groups[4].Value), 0) : arrivalTime; // If the time is prior to this train's start time, assume it is rolling over in to "tomorrow". if (arrivalTime < StartTime) { arrivalTime = arrivalTime.AddDays(1); departureTime = departureTime.AddDays(1); } stops.Add(new Stop(file.Strings[row][0].Replace(" $hold", "").Replace(" $forcehold", ""), arrivalTime, departureTime)); } } } Stops = stops.OrderBy(s => s.ArrivalTime); Consist = file.Strings[consistRow][serviceColumn].Replace(" $reverse", ""); Reversed = file.Strings[consistRow][serviceColumn].Contains(" $reverse"); Path = file.Strings[pathRow][serviceColumn]; } }