public static void TimetableFromCsv(object sender, DoWorkEventArgs e) { DateTime ThresholdDate = new DateTime(2010, 1, 1); if (DataContainer.model == null) { DataContainer.model = new railml(); } DataContainer.model.timetable = new timetable(); Dictionary <string, int> categories = new Dictionary <string, int>(); string filename = e.Argument as string; BackgroundWorker worker = sender as BackgroundWorker; CsvDefinition def = new CsvDefinition() { FieldSeparator = ',' }; CsvFileReader <TimetableEntry> reader = new CsvFileReader <TimetableEntry>(filename, def); int count = 0; RuntimeRep rep = new RuntimeRep(); List <StopDelay> stopdelays = new List <StopDelay>(); string traincode = ""; foreach (TimetableEntry entry in reader) { if (entry.TrainDate < ThresholdDate) { count++; continue; } string category = entry.TrainOrigin + "to" + entry.TrainDestination; if (categories.ContainsKey(category)) { categories[category] = (int)categories[category] + 1; } else { categories.Add(category, 1); //eCategory cat = new eCategory(); //cat.id = category; //cat.name = category; //DataContainer.model.timetable.categories.Add(cat); //eRostering roster = new eRostering(); //DataContainer.IDGenerator(roster); //roster.name = category; //DataContainer.model.timetable.rosterings.Add(roster); } if (entry.TrainDate != date || entry.TrainCode != traincode) { AddStopDelays(stopdelays, traincode, date); stopdelays = new List <StopDelay>(); if (rep.traincode != null) { trainvariations.AddRep(rep, date); } if (entry.TrainCode != traincode) { if (trainvariations != null) { string cat = categories.FirstOrDefault(x => x.Value == categories.Values.Max()).Key; trainvariations.category = cat; categories = new Dictionary <string, int>(); if (!DataContainer.model.timetable.rosterings.Any(x => x.name == cat)) { eRostering roster = new eRostering() { name = cat, scope = "scheduled" }; DataContainer.IDGenerator(roster); DataContainer.model.timetable.rosterings.Add(roster); } ProcessTimetableVariations(trainvariations); } trainvariations = new TrainVariations(); trainvariations.traincode = entry.TrainCode; worker.ReportProgress(0, new string[] { traincode, count.ToString() }); traincode = entry.TrainCode; } rep = new RuntimeRep(); date = entry.TrainDate; rep.traincode = entry.TrainCode; rep.destination = entry.TrainDestination; rep.origin = entry.TrainOrigin; } if (entry.LocationType == "O") { rep.departuretime = default(DateTime).Add(entry.ScheduledDeparture.TimeOfDay); } else if (entry.LocationType == "D") { rep.arrivaltime = default(DateTime).Add(entry.ScheduledArrival.TimeOfDay); } else if (entry.LocationType == "S") { Stop stop = new Stop() { location = entry.LocationCode, arrival = entry.ScheduledArrival, departure = entry.ScheduledDeparture }; rep.stops.Add(stop); if (entry.Arrival != default(DateTime) && entry.Departure != default(DateTime)) { StopDelay delay = new StopDelay() { location = entry.LocationCode, departuredelay = (entry.Departure - entry.ScheduledDeparture).TotalSeconds, arrivaldelay = (entry.Arrival - entry.ExpectedArrival).TotalSeconds }; stopdelays.Add(delay); } } //if (count > 300000) { break; } count++; } // Append the last trainvariation to the totalvariations list if (trainvariations != null) { string cat = categories.FirstOrDefault(x => x.Value == categories.Values.Max()).Key; trainvariations.category = cat; categories = new Dictionary <string, int>(); ProcessTimetableVariations(trainvariations); if (!DataContainer.model.timetable.rosterings.Any(x => x.name == cat)) { eRostering roster = new eRostering() { name = cat, scope = "scheduled" }; DataContainer.IDGenerator(roster); DataContainer.model.timetable.rosterings.Add(roster); } } e.Result = unhandled; }
private static void ProcessTimetableVariations(TrainVariations variations) { eTrain train = new eTrain(); train.id = variations.traincode; train.description = variations.category; train.scope = tTrainScope.primary; List <eTrainPart> trainparts = new List <eTrainPart>(); for (int i = 0; i < variations.dates.Count; i++) { try { eTrainPart trainpart = new eTrainPart() { id = train.id + "-" + i.ToString() }; var operatingperiod = CreateOperatingPeriod(variations.dates[i]); trainpart.operatingPeriodRef = new eOperatingPeriodRef() { @ref = operatingperiod.id }; DataContainer.model.timetable.operatingPeriods.Add(operatingperiod); eOcpTT departure = new eOcpTT() { ocpRef = DataContainer.model.infrastructure.operationControlPoints.Single(x => x.code == variations.reps[i].origin).id }; departure.times.Add(new eArrivalDepartureTimes() { departure = variations.reps[i].departuretime, scope = "scheduled" }); trainpart.ocpsTT.Add(departure); foreach (Stop stop in variations.reps[i].stops) { eOcpTT ocp = new eOcpTT() { ocpRef = DataContainer.model.infrastructure.operationControlPoints.Single(x => x.code == stop.location).id }; ocp.times.Add(new eArrivalDepartureTimes() { arrival = stop.arrival, departure = stop.departure, scope = "scheduled" }); trainpart.ocpsTT.Add(ocp); } eOcpTT arrival = new eOcpTT() { ocpRef = DataContainer.model.infrastructure.operationControlPoints.Single(x => x.code == variations.reps[i].destination).id }; arrival.times.Add(new eArrivalDepartureTimes() { arrival = variations.reps[i].arrivaltime, scope = "scheduled" }); trainpart.ocpsTT.Add(arrival); trainparts.Add(trainpart); tBlockPart blockpart = new tBlockPart() { trainPartRef = trainpart.id, startOcpRef = variations.reps[i].origin, endOcpRef = variations.reps[i].destination, operatingPeriodRef = operatingperiod.id, begin = variations.reps[i].departuretime, end = variations.reps[i].arrivaltime }; DataContainer.IDGenerator(blockpart); eRostering roster = DataContainer.model.timetable.rosterings.Single(e => e.name == variations.category); roster.blockParts.blockPart.Add(blockpart); eBlock block = new eBlock() { code = train.id }; DataContainer.IDGenerator(block); eBlockPartSequence seq = new eBlockPartSequence() { sequence = "1" }; seq.blockPartRef.Add(new tBlockPartRef() { @ref = blockpart.id }); block.blockPartSequence.Add(seq); roster.blocks.Add(block); tCirculation circ = new tCirculation() { startDate = operatingperiod.startDate, endDate = operatingperiod.endDate, operatingPeriodRef = operatingperiod.id, blockRef = block.id }; roster.circulations.Add(circ); } catch { unhandled++; } } for (int i = 0; i < trainparts.Count; i++) { eTrainPartSequence seq = new eTrainPartSequence() { sequence = i.ToString() }; seq.trainPartRef.Add(new tTrainPartRef() { @ref = trainparts[i].id }); train.trainPartSequence.Add(seq); } DataContainer.model.timetable.trains.Add(train); DataContainer.model.timetable.trainParts.AddRange(trainparts); }