Exemplo n.º 1
0
 private bool TryGetStationId(string text, out int result)
 {
     if (!int.TryParse(text, out var n))
     {
         var station = StationReader.GetStationByName(text);
         if (station is null)
         {
             result = default;
             return(false);
         }
         else
         {
             result = station.StationId;
             return(true);
         }
     }
     if (n > 0 && n < 5)
     {
         result = n;
         return(true);
     }
     else if (StationReader.GetStationById(n) is null)
     {
         result = default;
         return(false);
     }
     else
     {
         result = n;
         return(true);
     }
 }
Exemplo n.º 2
0
        /// <summary>
        /// <see cref="RawTrainDataFile"/>を解析して<see cref="TrainDataFile"/>を取得します。
        /// </summary>
        /// <param name="rawTrainDataFile">解析対象のデータ</param>
        /// <returns></returns>
        public static TrainDataFile ParseRawTrainDataFile(RawTrainDataFile rawTrainDataFile)
        {
            var getedDateTime = DateTime.ParseExact(rawTrainDataFile.Departures_datetime.ToString(), "yyyyMMddHHmm", System.Globalization.DateTimeFormatInfo.InvariantInfo);
            var station       = StationReader.GetStationById(rawTrainDataFile.StationId);

            var gettedHour          = getedDateTime.Hour;
            var arrivalTrainDatas   = new Dictionary <JrhDestType, IReadOnlyList <TrainData> >();
            var departureTrainDatas = new Dictionary <JrhDestType, IReadOnlyList <TrainData> >();

            foreach (var rawArrData in rawTrainDataFile.Arrivals)
            {
                var dest = JrhDestTypeCreater.FromParseText(rawArrData.Key);

                var data = rawArrData.Value.Select(rtd => TrainDataParser.ParseTrainData(rtd, gettedHour, station, TrainData.ArrivalTypes.Arrival));
                arrivalTrainDatas.Add(dest, Array.AsReadOnly(data.ToArray()));
            }

            foreach (var rawDepData in rawTrainDataFile.Departures)
            {
                var dest = JrhDestTypeCreater.FromParseText(rawDepData.Key);
                var data = rawDepData.Value.Select(rtd => TrainDataParser.ParseTrainData(rtd, gettedHour, station, TrainData.ArrivalTypes.Departure));
                departureTrainDatas.Add(dest, Array.AsReadOnly(data.ToArray()));
            }

            return(new TrainDataFile(station, getedDateTime, departureTrainDatas, arrivalTrainDatas));
        }
Exemplo n.º 3
0
        public static string GetSaveFileName(int id, DateTime dateTime)
        {
            string defaultFileName;

            if (id >= 1 && id < 5)
            {
                defaultFileName = $"{id} {dateTime.ToString("yyyy-MM-dd_HH-mm-ss")}";
            }
            else
            {
                defaultFileName = $"{StationReader.GetStationById(id).Name} {dateTime.ToString("yyyy-MM-dd_HH-mm-ss")}";
            }
            return(defaultFileName);
        }
Exemplo n.º 4
0
        private static async Task <Dictionary <int, TrainDataFile> > GetTrainDatas(params int[] id)
        {
            var result = new Dictionary <int, TrainDataFile>();

            var stations       = id.Select(n => StationReader.GetStationById(n));
            var inAreaStaion   = stations.Where(std => std.StationArea == 0).ToArray();
            var outAreaStation = stations.Where(std => std.StationArea != 0);

            var count = 0;

            if (inAreaStaion.Any())
            {
                TrainDataFile[] array = default;
                do
                {
                    array = await Task.WhenAll(inAreaStaion.Select(n => TrainInfoReader.GetTrainDataAsync(n.StationId)));

                    for (var i = 0; i < array.Length; i++)
                    {
                        result.Add(inAreaStaion[i].StationId, array[i]);
                    }

                    count++;
                    if (count > 3)
                    {
                        throw new TrainDataTimeSyncException(result, "時刻が同期できません");
                    }

                    if (count > 1)
                    {
                        Debuggers.LogWriter.WriteLog($"列車位置計算用の列車情報の時刻同期に失敗...再試行します");
                    }
                }while (!CheckTrainDataFiles(array));
            }

            if (outAreaStation.Any())
            {
                var need  = outAreaStation.Select(std => std.StationArea).Distinct().ToArray();
                var array = await Task.WhenAll(need.Select(n => TrainInfoReader.GetSpecialTrainDatasAsync(n)));

                foreach (var station in outAreaStation)
                {
                    var index = Array.IndexOf(need, station.StationArea);
                    result.Add(station.StationId, array[index].First(td => td.Station == station));
                }
            }

            return(result);
        }
Exemplo n.º 5
0
        private static async Task <Dictionary <int, TrainDataFile> > GetTrainDatas(IEnumerable <TrainDataFile> trainDataFiles, params int[] id)
        {
            var result = new Dictionary <int, TrainDataFile>();

            var stations = id.Select(n => StationReader.GetStationById(n));

            return(await Task.Run(() =>
            {
                var keyValuePairs = new Dictionary <int, TrainDataFile>();
                foreach (var n in id)
                {
                    keyValuePairs.Add(n, trainDataFiles.First(tdf => tdf.Station.StationId == n));
                }
                return keyValuePairs;
            }));
        }
Exemplo n.º 6
0
        /// <summary>
        /// 駅 ID を指定して列車情報を取得します。エリア外の駅の場合広域データから列車情報を返します。
        /// </summary>
        /// <param name="id">取得対象の駅 ID。</param>
        /// <returns>解析済みの列車情報。</returns>
        public static async Task <TrainDataFile> GetTrainDataAsync(int id)
        {
            var station = StationReader.GetStationById(id);

            if (station.StationArea != 0)
            {
                return(await GetSpecialTrainDataAsync(station));
            }

            var data = await TrainDataGeter.GetTrainDataJsonAsync(id);

            return(await Task.Run(() =>
            {
                var rawTrainDataFile = JsonDeserializer.DeserializeTrainInfo(data);
                return TrainFilePaeser.ParseRawTrainDataFile(rawTrainDataFile);
            }));
        }
Exemplo n.º 7
0
        private async Task DataGeter(CancellationToken cancellationToken, IEnumerable <int> id, string saveFolderPath)
        {
            while (true)
            {
                var savePath = saveFolderPath + $"\\{DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss")}";
                Directory.CreateDirectory(savePath);

                var saveFileWriter = new SaveFileWriter(savePath);
                await Task.Run(() =>
                {
                    Parallel.ForEach(id, async staId =>
                    {
                        try
                        {
                            await saveFileWriter.SaveTrainData(staId);
                            if (staId < 5)
                            {
                                LogText.WriteLine($"{DateTime.Now}: 広域データID{staId}を保存しました...");
                            }
                            else
                            {
                                LogText.WriteLine($"{DateTime.Now}: {StationReader.GetStationById(staId).Name}を保存しました...");
                            }
                        }
                        catch (TrainDataGetException ex)
                        {
                            LogText.WriteLine("通信中に例外が発生しました...");
                            throw;
                        }
                    });
                });

                LogText.WriteLine("取得プロセス一時停止(取得完了)...");
                await Task.Delay(DelayTime * 60 * 1000, cancellationToken);

                if (cancellationToken.IsCancellationRequested)
                {
                    break;
                }
            }
        }