/// <summary> /// 为列车时刻表中的车站Id、车次线路表Id赋值,并写入数据库 /// </summary> private static void WriteTrainMoments(TimeTable table) { for (var i = 0; i < table.Moments.Count; i++) { table.Moments[i].Sort = i; table.Moments[i].TrainStationId = table.Stations[i].Id; table.Moments[i].TrainNoLineId = table.TrainNoLineRelation.Id; } var bll = new TrainMomentBll(); var maxId = (int)bll.GetMaxId(); bll.BulkInsert(table.Moments); DataUpdateLog.BulkUpdate(nameof(TrainMoment), maxId); }
/// <summary> /// 构造线路-车站关系并写入数据库 /// </summary> /// <param name="table"></param> private static void WriteLineStaionRelation(TimeTable table) { // 构造线路-车站关系并写入数据库 var lineStationRelation = new List <LineStations>(); for (var i = 0; i < table.Stations.Count; i++) { lineStationRelation.Add(new LineStations { LineId = table.Line.Id, Sort = i, StationId = table.Stations[i].Id, StationName = table.Stations[i].StationName }); } var lineStationsBll = new LineStationsBll(); var startId = (int)lineStationsBll.GetMaxId(); // 记录插入之前的最大ID lineStationsBll.BulkInsert(lineStationRelation); DataUpdateLog.BulkUpdate(nameof(LineStations), startId); // 将数据更新记录同步到DbUpdataLog表中 }
/// <summary> /// 按照"格式二"从指定的<see cref="ISheet"/>对象中提取信息 /// 并创建<see cref="TimeTable"/>对象集合返回 /// </summary> /// <param name="sheet">将作为数据源的<see cref="ISheet"/>对象</param> /// <returns><see cref="TimeTable"/>对象集合</returns> private static List <TimeTable> GetTimeTableOfStyleTwo(ISheet sheet) { // 从第二行中获取列车运行方向 var row = sheet.GetRow(1); var title = row.Cells[0].ToString(); // 从字符串"古店-集宁间上行列车时刻表"中提取"上行" var direction = title.Substring(title.IndexOf("行列车时刻表") - 1, 2); // 从第八行和第九行中提取所有车次 row = sheet.GetRow(7); var row9 = sheet.GetRow(8); var stationColNum = Regex.Replace(row.Cells[0].ToString(), @"\s", "") == "区间公里" ? 2 : 0; // 车站所在列的索引 var trainNos = new List <string>(); for (var i = stationColNum + 1; i < row.Cells.Count; i++) { // 车次列索引从车站后一列开始 var value = row.Cells[i].ToString().Trim(); var value1 = row9.Cells[i].ToString().Trim(); // 有的车次占了第八和第九两行 if (!string.IsNullOrEmpty(value)) { trainNos.Add(value + value1); } } // 从第一或者第三列中提取所有车站(有的表格车站在第三列,而有的在第一列) // 从第十行开始循环 var stations = new List <BaseStation>(); for (var i = 9; i < sheet.LastRowNum; i++) { row = sheet.GetRow(i); var txt = row.Cells[stationColNum].ToString(); if (!string.IsNullOrEmpty(txt)) { var name = txt.Trim(); var pinyin = PinyinHelper.GetInitials(name).ToLower(); stations.Add(new BaseStation { Spell = pinyin, StationName = name }); } } // 循环车次列表,生成列车时刻表集合 var startColNum = stationColNum + 1; var timeTables = new List <TimeTable>(); for (var trainNoIndex = 0; trainNoIndex < trainNos.Count; trainNoIndex++) { var timeTable = new TimeTable(); // 从第二或者第四列开始,逐列获取列车时刻表 var sort = 1; var stationIndex = 0; // 通过此索引从车站列表中获取与时刻表对应的车站 var colIndex = startColNum + trainNoIndex; // 随着车次索引的增加,相应的改变获取时刻表的单元格索引 for (var rowIndex = 9; rowIndex < sheet.LastRowNum; rowIndex++) { row = sheet.GetRow(rowIndex); var arrive = row.Cells[colIndex].ToString().Trim().Replace("...", ""); rowIndex++; row = sheet.GetRow(rowIndex); var start = row.Cells[colIndex].ToString().Trim().Replace("...", ""); // 出发或者到达时间任意一个不为空 // 则表明本车次将经过stationIndex所对应的车站 // 否则表示本车次不经过此车站,则不将此车站添加到 // 本车次对应的车站列表中 if (!string.IsNullOrEmpty(arrive) || !string.IsNullOrEmpty(start)) { arrive = TimeFormatter(arrive); start = TimeFormatter(start); timeTable.Stations.Add(stations[stationIndex]); timeTable.Moments.Add(new TrainMoment { ArriveTime = arrive, DepartTime = start, Sort = sort++ }); } stationIndex++; // 如果stationIndex已经超出了车站数量,则结束循环 if (stationIndex >= stations.Count) { break; } } // 重置索引和排序 stationIndex = 0; sort = 1; // 如果是上行车次,需要将车站及列车时刻反转 if (direction == "上行") { timeTable.Stations.Reverse(); timeTable.Moments.Reverse(); // 改变序号,并将出发及到达时间互换 sort = 1; timeTable.Moments.ForEach(item => { var temp = item.ArriveTime; item.ArriveTime = item.DepartTime; item.DepartTime = temp; item.Sort = sort++; }); } // 创建车次及线路对象 var firstStation = timeTable.Stations.First().StationName; var lastStation = timeTable.Stations.Last().StationName; timeTable.TrainNo = new TrainNo { Direction = direction, FullName = trainNos[trainNoIndex], FirstStation = firstStation, LastStation = lastStation, RunType = 2 }; timeTable.Line = new BaseLine { FirstStation = firstStation, LastStation = lastStation, LineName = $"{firstStation}-{lastStation}" }; timeTables.Add(timeTable); } return(timeTables); }
/// <summary> /// 按照"格式一"从指定的<see cref="ISheet"/>对象中提取信息 /// 并创建<see cref="TimeTable"/>对象返回 /// </summary> /// <param name="sheet">将作为数据源的<see cref="ISheet"/>对象</param> /// <returns><see cref="TimeTable"/>对象</returns> private static TimeTable GetTimeTableOfStyleOne(ISheet sheet) { var timeTable = new TimeTable(); // 从第五行第一个单元格中提取车次、线路信息 var fifthRow = sheet.GetRow(4); timeTable.TrainNo = GetTrainNo(fifthRow); timeTable.Line = GetLine(fifthRow); // 判断是否是动车时刻表,若是,则将所有单元格索引+1 InitialCellIndexs(timeTable.TrainNo.Code); // 判断车次方向,若是上行,则将表格从后往前循环 // 反之,则从前往后循环(从索引6开始) var isUpword = IsUpward(timeTable.TrainNo.FullName); var start = isUpword ? sheet.LastRowNum : STARTINDEX; var end = isUpword ? STARTINDEX : sheet.LastRowNum; // 循环表格,提取信息到timeTable对象中 // 每次循环读取两行数据,index相应的加/减2 // 循环结束条件为:当前读取到的车站名称与区段结束车站名称相同 Func <int, int> getNextIndex = i => isUpword ? i - 1 : i + 1; // 此方法用于处理索引的递增或者递减 var loopIsEnd = false; var index = start; while (!loopIsEnd) { var stationRow = sheet.GetRow(index); index = getNextIndex(index); // 若读取到的是空行,则跳过继续读取下一行 if (!IsEmptyRow(stationRow)) { var speedRow = sheet.GetRow(index); index = getNextIndex(index); // 将读取两行数据: // 第一行数据中包含车站名称、发车时间以及到达时间 // 第二行数据中包含区间运行时间, 区间平均速度以及区间停车时间 var moment = GetTrainMoment(stationRow, speedRow); if (moment != null) { var station = GetStation(stationRow); timeTable.Stations.Add(station); timeTable.Moments.Add(moment); if (station.StationName == timeTable.TrainNo.LastStation) { loopIsEnd = true; // 循环结束 } } } // 防止死循环的情况发生 if (stationRow == null) { loopIsEnd = true; // 循环结束 } } return(timeTable); }