В версии S# 4.0 формат данных был 1.XXX. В версии S# 4.1 было два формата, 2.0 и 3.0. Ниже два скрипта. Первый переводит 1.XXX в 2.0. Второй переводит из 2.0 в 3.0. Кто использует Гидру 4.0, нужно использовать оба скрипта, и прогнать их друг за другом. Кто уже использовал 4.1, то прогнать только второй. Пути, естественно, заменить в коде.
Конвертация в формат 2.0:
Код
foreach (var secDir in Directory.EnumerateDirectories(@"d:\SS\D\HydraRi3"))
{
if (Directory.EnumerateFiles(secDir).Any())
continue;
var dateDirs = Directory.GetDirectories(secDir);
var prefixes = new[] { "trades", "quotes" };
foreach (var prefix in prefixes)
{
var metaInfo = new Dictionary<DateTime, IDictionary<string, object>>();
foreach (var dir in dateDirs)
{
var date = Path.GetFileName(dir).ToDateTime("yyyy_MM_dd");
var files = Directory.GetFiles(dir);
var meta = files.FirstOrDefault(f => Path.GetFileName(f) == prefix+".xml");
var data = files.FirstOrDefault(f => Path.GetFileName(f) == prefix+".bin");
if (null != meta)
{
CultureInfo.InvariantCulture.DoInCulture(() => metaInfo.Add(date, new XmlSerializer<IDictionary<string, object>>().Deserialize(meta)));
File.Move(data, Path.Combine(secDir, prefix + "_" + Path.GetFileName(dir) + ".bin"));
}
}
CultureInfo.InvariantCulture.DoInCulture(() => new XmlSerializer<IDictionary<DateTime, IDictionary<string, object>>>().Serialize(metaInfo, Path.Combine(secDir, prefix+".xml")));
}
foreach (var dir in dateDirs)
{
Directory.Delete(dir, true);
}
Console.WriteLine(Path.GetFileName(secDir));
}
Конвертация в формат 3.0:
Код
var input = @"d:\SS\D\HydraRi3";
var output = @"d:\SS\D\HydraRi5.1";
foreach (var secDir in Directory.EnumerateDirectories(input))
{
var prefixes = new[] { "quotes", "trades", "orderLog" };
var secId = Path.GetFileName(secDir);
Directory.CreateDirectory(Path.Combine(output,secId));
foreach (var prefix in prefixes)
{
var metafile = secDir + "\\" + prefix + ".xml";
if (File.Exists(metafile))
{
IDictionary<DateTime, IDictionary<string, object>> data=null;
CultureInfo.InvariantCulture.DoInCulture(() => data = new XmlSerializer<IDictionary<DateTime, IDictionary<string, object>>>().Deserialize(metafile));
//Directory.EnumerateFiles(secDir);
foreach (var date in data.Keys)
{
var fileName = "{0}_{1}.bin".Put(prefix, date.ToString("yyyy_MM_dd"));
fileName = Path.Combine(secDir,fileName);
if (File.Exists(fileName))
{
var outSecDir = Path.Combine(output, secId, date.ToString("yyyy_MM_dd"));
Directory.CreateDirectory(outSecDir);
var outFile = Path.Combine(outSecDir, prefix + ".bin");
using (var s = new FileStream(outFile, FileMode.Create, FileAccess.Write))
{
var dict = data[date];
s.WriteByte(3); s.WriteByte(0);
s.Write((int)dict["count"]);
s.Write((decimal)dict["minStepSize"]);
s.Write((decimal)0);
s.Write(new DateTime(dict["firstTime"].To<long>()));
s.Write(new DateTime(dict["prevTime"].To<long>()));
if (prefix.Equals("trades"))
{
s.Write((long)dict["firstId"]);
s.Write((long)dict["prevId"]);
s.Write((decimal)dict["firstPrice"]);
s.Write((decimal)dict["prevPrice"]);
}
else if (prefix.Equals("quotes"))
{
s.Write((decimal)dict["firstPrice"]);
s.Write((decimal)dict["prevPrice"]);
}
else if (prefix.Equals("orderLog"))
{
s.Write((long)dict["firstOrderId"]);
s.Write((long)dict["firstTradeId"]);
s.Write((long)dict["prevOrderId"]);
s.Write((long)dict["prevTradeId"]);
s.Write((decimal)dict["firstPrice"]);
s.Write((decimal)dict["prevPrice"]);
}
s.WriteRaw(File.ReadAllBytes(fileName));
}
}
}
}
}
}