Ejemplo n.º 1
0
        /// <summary>
        /// Перебирает все бин файлы с тиками и заменяет файлы где нашлись дубли или несортировано на новые версии.
        /// Старые версии сохраняет поставив перед именем префикс "__"
        /// </summary>
        /// <param name="tickerInfo"></param>
        /// <param name="range"></param>
        /// <param name="progress"></param>
        /// <returns></returns>
        public async static Task BinDeDupTradesAdync(TradesTickerInfo tickerInfo, DateRange range, IProgress <ProgressReport> progress)
        {
            var timer = new Stopwatch();

            timer.Start();

            var totalReplaced = await Task.Factory.StartNew <int>(() =>
            {
                #region Тело метода

                // получим список путей до бинарников с учетом ограничений по дате
                var matсhingDates = range == null
                                        ? tickerInfo.Dates
                                        : tickerInfo.Dates.Where(range.Includes);

                var pathList = matсhingDates.Select(date =>
                {
                    var fileName = "{0}.{1}.bin".Put(tickerInfo.Ticker, date.ToString(TickBinFileNameDateFormat));
                    return(Path.Combine(tickerInfo.BinPath, fileName));
                }).ToArray();

                // Для каждого бинарного файла тикер, производим проверку и перезапись если нужно сортировать
                var cache          = new BinaryCache <TradeInfo>();
                var filesProcessed = 0;
                var filesReplaced  = 0;
                foreach (var path in pathList)
                {
                    var version = BinaryCache <TradeInfo> .ReadVersion(path);
                    if (version == 0)
                    {
                        throw new Exception("Не удалось получить версию формата файла.");
                    }

                    // загружаем тики из бинарного кэша
                    var trades = cache.LoadCached(path, version);

                    // удалим дубли, и если увидим что число сделок упало, значит надо переписать исходный файл
                    var origCount = trades.Count;
                    var sorted    = trades.Distinct(new TradeInfoComparer()).OrderBy(t => t.TradeNo).ToList();

                    if (sorted.Count != origCount)
                    {
                        var bakFileName = "__" + Path.GetFileName(path);
                        var bakDirName  = Path.GetDirectoryName(path);
                        var bakPath     = Path.Combine(bakDirName, bakFileName);
                        File.Move(path, bakPath);

                        cache.SaveCached(path, sorted);
                        filesReplaced++;
                    }

                    // отчитались
                    filesProcessed++;
                    progress.Report(new ProgressReport()
                    {
                        Percent        = (double)filesProcessed * 100 / pathList.Length,
                        TimeUsed       = timer.Elapsed,
                        ProcessedCount = filesProcessed
                    });
                }

                return(filesReplaced);

                #endregion
            });

            timer.Stop();
            progress.Report(new ProgressReport()
            {
                Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalReplaced
            });
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Пишет весь тикер в текстовый файл  с учетом временных ограничений.
        /// Для каждого бин файла вызывается <paramref name="progress"/>
        /// </summary>
        /// <param name="tickerInfo"></param>
        /// <param name="range">Временной диапазон, за который конвертить данные. Если задать null то все данные брать.</param>
        /// <param name="progress">прогрессор. Для отчетности о выполнении работы</param>
        public async static Task BinToTxtTradesAsync(TradesTickerInfo tickerInfo, DateRange range, IProgress <ProgressReport> progress)
        {
            var timer = new Stopwatch();

            timer.Start();

            var totalProcessed = await Task.Factory.StartNew <int>(() =>
            {
                #region Тело метода
                var trdName = "{0}.trd".Put(tickerInfo.Ticker);
                var trdPath = Path.Combine(tickerInfo.BinPath, trdName);
                var streamW = new StreamWriter(trdPath, false);

                streamW.WriteLine(TickTxtHeaderFull);

                // получим список путей до бинарников с учетом ограничений по дате
                var matсhingDates = range == null
                                        ? tickerInfo.Dates
                                        : tickerInfo.Dates.Where(range.Includes);

                var pathList = matсhingDates.Select(date =>
                {
                    var fileName = "{0}.{1}.bin".Put(tickerInfo.Ticker, date.ToString(TickBinFileNameDateFormat));
                    return(Path.Combine(tickerInfo.BinPath, fileName));
                }).ToArray();

                // Для каждого бинарного файла тикер, производим процедуру записи в ТХТ файл.
                var cache          = new BinaryCache <TradeInfo>();
                var filesProcessed = 0;
                foreach (var path in pathList)
                {
                    var version = BinaryCache <TradeInfo> .ReadVersion(path);
                    if (version == 0)
                    {
                        throw new Exception("Не удалось получить версию формата файла.");
                    }

                    // пишем в текст
                    var trades = cache.LoadCached(path, version);
                    trades.ForEach(t => streamW.WriteLine(t.ToFullString()));

                    // отчитались
                    filesProcessed++;
                    progress.Report(new ProgressReport()
                    {
                        Percent        = (double)filesProcessed * 100 / pathList.Length,
                        TimeUsed       = timer.Elapsed,
                        ProcessedCount = filesProcessed
                    });
                }

                // Скидываем на диск и закрываем потоки.
                streamW.Flush();
                streamW.Close();

                return(pathList.Length);

                #endregion
            });

            timer.Stop();
            progress.Report(new ProgressReport()
            {
                Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalProcessed
            });
        }