diff --git a/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs b/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs index ad27f52..ded3d0d 100644 --- a/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs +++ b/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs @@ -27,7 +27,7 @@ namespace BoerseDataConvert { StringBuilder xmlRecord = new StringBuilder(); xmlRecord.Append($" \n"); - foreach (var tagValue in record.TagsValues) + foreach (var tagValue in record) { try { @@ -43,27 +43,16 @@ namespace BoerseDataConvert count++; return xmlRecord.ToString(); } - private string CheckTagValue(string tag, string value) + private string CheckTagValue(int tag, string value) { - string[] tagLine; - try//Checks if the tag exists + + if(tagsTable.CheckInvalidTag(tag)) throw new ArgumentException($"WARN: Invalid tag \"{tag}\", {cur_fileName} line {count + 1}"); + string tagname = tagsTable.GetTagName(tag); + if (value != "NULL" && tagsTable.HaveValueRanges(tag))//Checks if the tag have not a value ranges { - tagLine = tagsTable.GetTagValue(tag); - } - catch (KeyNotFoundException) - { - throw new ArgumentException($"WARN: Invalid tag \"{tag}\", {cur_fileName} line {count + 1}"); - } - string tagname = tagLine[0]; - if (value != "NULL" && tagLine.Length == 2)//Checks if the tag have not a value ranges - { - string[] valueType = tagLine[1].Split('-').ToArray(); - if (valueType.Length == 2)//Checks if value type is string - { - if (value.Length > int.Parse(valueType[1]))//Checks if the length of the value is bigger than permitted - { - throw new ArgumentException($"WARN: Too long value \"{tag}\", \"{value}\", max allowed \"{valueType[1]}\", {cur_fileName} line {count + 1}"); - } + if (tagsTable.IsString(tag) && tagsTable.CheckStringLength(tag,value.Length))//Checks if value type is string + { + throw new ArgumentException($"WARN: Too long value \"{tag}\", \"{value}\", max allowed \"{tagsTable.GetTagName(tag)}\", {cur_fileName} line {count + 1}"); } else//Checks if value type is decimal { diff --git a/BoerseDataConvert/BoerseDataConvert/Model/Record.cs b/BoerseDataConvert/BoerseDataConvert/Model/Record.cs index 67036e2..7df267c 100644 --- a/BoerseDataConvert/BoerseDataConvert/Model/Record.cs +++ b/BoerseDataConvert/BoerseDataConvert/Model/Record.cs @@ -8,6 +8,6 @@ namespace BoerseDataConvert { public class Record { - public List>TagsValues; + public List>TagsValues; } } diff --git a/BoerseDataConvert/BoerseDataConvert/Model/Tag.cs b/BoerseDataConvert/BoerseDataConvert/Model/Tag.cs new file mode 100644 index 0000000..8883ad9 --- /dev/null +++ b/BoerseDataConvert/BoerseDataConvert/Model/Tag.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BoerseDataConvert +{ + public class Tag + { + private string name; + private bool isString; + private int stringLength; + private bool haveValueRanges; + private string[] valueRanges; + + public Tag(string[] input) + { + name = input[0]; + string[] type = input[1].Split('-').ToArray(); + if (type.Length == 2) + { + isString = true; + stringLength = int.Parse(type[1]); + } + else isString = false; + if (input.Length == 3) + { + valueRanges = input[2].Split('#').ToArray(); + } + else haveValueRanges = false; + } + public string Name + { + get { return name; } + } + public bool IsString + { + get { return isString; } + } + public bool HaveValueRanges + { + get { return haveValueRanges; } + } + public int StringLength + { + get { return stringLength; } + } + public bool ValidValue(string value) + { + foreach (string validValue in valueRanges) + { + if (validValue == value) + { + return true; + } + } + return false; + } + } +} diff --git a/BoerseDataConvert/BoerseDataConvert/Model/TagsTable.cs b/BoerseDataConvert/BoerseDataConvert/Model/TagsTable.cs index 6ab7658..2c422e7 100644 --- a/BoerseDataConvert/BoerseDataConvert/Model/TagsTable.cs +++ b/BoerseDataConvert/BoerseDataConvert/Model/TagsTable.cs @@ -10,11 +10,11 @@ namespace BoerseDataConvert public class TagsTable { StreamReader reader ; - Dictionary table; + Tag[] table;//name,isSring,stringLength, public TagsTable(string tags) { reader = new StreamReader(tags); - table = new Dictionary(); + table = new Tag[int.Parse(reader.ReadLine())]; LoadInfo(); } private void LoadInfo() @@ -24,13 +24,37 @@ namespace BoerseDataConvert while (!reader.EndOfStream) { string[] line = reader.ReadLine().Split('|').ToArray(); - table.Add(line[0], line.Skip(1).ToArray()); + table[int.Parse(line[0])]= new Tag(line); } } } - public string[] GetTagValue(string tag) + public bool CheckInvalidTag(int tag) { - return table[tag]; + return table[tag]==null; + } + public string GetTagName(int tag) + { + return table[tag].Name; + } + public bool IsString(int tag) + { + return table[tag].IsString; + } + public bool HaveValueRanges(int tag) + { + return table[tag].HaveValueRanges; + } + public int GetMaxValueLengthToBig(int tag) + { + return table[tag].StringLength; + } + public bool CheckStringLength(int tag, int value) + { + return table[tag].StringLength>a = new List>(); + string[] sr = s.Split("|").ToArray(); + Record record = new Record(); foreach (var item in sr) { - string[] d = item.Split('#').ToArray(); - var pair = new KeyValuePair(d[0], String.Join('#', d.Skip(1))); - a.Add(pair); - } - Record record = new Record(); - record.TagsValues = a; + string[] d = item.Split('#',2).ToArray(); + record.Add(int.Parse(d[0]), d[1]); + } return record; } internal static void EndFile() diff --git a/BoerseDataConvert/tags.txt b/BoerseDataConvert/tags.txt index 52f521e..800ac41 100644 --- a/BoerseDataConvert/tags.txt +++ b/BoerseDataConvert/tags.txt @@ -1,3 +1,4 @@ +901 001|Product_Type|str-3|WAR#KO#EXO#AZE#AKA#BSK#IND 002|Type_Underlying_Instrument|str-3|BND#BSK#COM#CUR#FI#FON#FUT#IND#KOB#MUL#STO#DER#ETC#PRC 004|Option_Type|str-4|PUT#CALL#NULL