public async static Task TxtToBinBarsAsync(string filePath, string binPrefix, Interval interval, IProgress <ProgressReport> progress) { var timer = new Stopwatch(); timer.Start(); var totalProcessed = await Task.Factory.StartNew <int>(() => { #region Тело метода var cache = new BinaryCache <DataBar>(); var sr = new StreamReader(filePath); var dirPath = Path.GetDirectoryName(filePath); var items = new List <DataBar>(); // Пропустим первую строчку ибо в ней заголовки sr.ReadLine(); while (!sr.EndOfStream) { var line = sr.ReadLine(); var dataBar = FromFullString(line); items.Add(dataBar); } // После завершения работы пишем в файл те сделки которые еще не записаны if (items.Count > 0) { var path = Path.Combine(dirPath, @"{0}.{1}.bin".Put(binPrefix, interval.ToString())); cache.SaveCached(path, items); items.Clear(); } sr.Close(); return(1); #endregion }); timer.Stop(); progress.Report(new ProgressReport() { Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalProcessed }); }
/// <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 }); }
public async static Task TxtToBinTradesAsync(string filePath, string binPrefix, IProgress <ProgressReport> progress) { var timer = new Stopwatch(); timer.Start(); var totalProcessed = await Task.Factory.StartNew <int>(() => { #region Тело метода var cache = new BinaryCache <TradeInfo>(); var sr = new StreamReader(filePath); var dirPath = Path.GetDirectoryName(filePath); // будет сейвить данные на диск. убрали дублирование кода ниже Action <IList <TradeInfo>, DateTime> saveAndClear = (tradeList, dateTime) => { var path = Path.Combine(dirPath, @"{0}.{1}.bin".Put(binPrefix, dateTime.ToString(TickBinFileNameDateFormat))); // устраняем дубли, сортируем по номеру сделок var sorted = tradeList.Distinct(new TradeInfoComparer()).OrderBy(t => t.TradeNo).ToArray(); cache.SaveCached(path, sorted); tradeList.Clear(); }; // Пропустим первую строчку ибо в ней заголовки sr.ReadLine(); var trades = new List <TradeInfo>(); var currDate = DateTime.MinValue; var processedCount = 0; while (!sr.EndOfStream) { var line = sr.ReadLine(); var tradeInfo = new TradeInfo(); tradeInfo.FromFullString(line); if (currDate == DateTime.MinValue) { currDate = tradeInfo.Date.Date; } // Если взяли сделку со следующего дня, пишем то что есть в файл. if (tradeInfo.Date.Date > currDate) { saveAndClear(trades, currDate); // отчитались processedCount++; progress.Report(new ProgressReport() { ProcessedCount = processedCount, TimeUsed = timer.Elapsed, Date = currDate }); // currDate = tradeInfo.Date.Date; } trades.Add(tradeInfo); } // После завершения работы пишем в файл те сделки которые еще не записаны if (trades.Count > 0) { saveAndClear(trades, currDate); // отчитались processedCount++; progress.Report(new ProgressReport() { ProcessedCount = processedCount, TimeUsed = timer.Elapsed, Date = currDate }); } sr.Close(); return(processedCount); #endregion }); timer.Stop(); progress.Report(new ProgressReport() { Finished = true, Percent = 100, TimeUsed = timer.Elapsed, ProcessedCount = totalProcessed }); }