/// <summary>
        /// Reads file with synonyms from MOBY format
        /// </summary>
        /// <param name="filename">The filename.</param>
        /// <param name="datastructure">The in memory storage structure.</param>
        /// <exception cref="System.IO.FileNotFoundException">Passed filename with keywords not found.</exception>
        /// <exception cref="System.IO.IOException">Failed to read file.</exception>
        public void ReadFile(string filename, ref IinMemoryStorageStructure datastructure)
        {
            if (datastructure == null)
            {
                throw new ArgumentNullException("data structure must me initialized and could not be null");
            }

            if (!File.Exists(filename))
            {
                throw new FileNotFoundException("Passed filename with keywords not found.", filename);
            }

            int stringCounter = 0;

            using (StreamReader reader = new System.IO.StreamReader(filename))
            {
                while (!reader.EndOfStream)
                {
                    stringCounter++;
                    var input = reader.ReadLine();
                    if (input.IndexOf(',') > 0)
                    {
                        var keyword = input.Substring(0, input.IndexOf(","));
                        if (this.validator != null && !this.validator.Validate(keyword))
                        {
                            throw new FormatException(string.Format("Format on the line {0} is not right. Keyword '{1}' contains illegal characters", stringCounter, keyword));
                        }

                        var collection = input.Substring(input.IndexOf(",") + 1).Trim().Split(',').Select(s => s.Trim()).ToArray();
                        List<string> checkedCollection = new List<string>();
                        foreach (var item in collection)
                        {
                            if (this.validator != null && !this.validator.Validate(item))
                            {
                                throw new FormatException(string.Format("Format on the line {0} is not right. Illegal characters value: '{1}'", stringCounter, item));
                            }

                            if (item.Trim().Equals(string.Empty))
                            {
                                // skip silently
                            }
                            else
                            {
                                checkedCollection.Add(item.Trim());
                            }
                        }

                        datastructure.AddSynonyms(keyword.Trim(), checkedCollection.ToArray());
                    }
                }
            }
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="InMemorySuggester"/> class.
        /// </summary>
        /// <param name="storageStructure">Storage DI</param>
        /// <param name="reader">reader that reads file to memory from specified format</param>
        /// <param name="filename">Filename</param>
        /// <param name="sourceName">Optional name of the source</param>
        public InMemorySuggester(IinMemoryStorageStructure storageStructure, IToMemoryReader reader, string filename, string sourceName = "")
        {
            if (storageStructure == null)
            {
                throw new ArgumentNullException("storageSturcture could not be null");
            }

            if (reader == null)
            {
                throw new ArgumentNullException("reader could not be null");
            }

            this.reader = reader;
            this.storage = storageStructure;
            this.reader.ReadFile(filename, ref this.storage);
            this.id = Guid.NewGuid();
            this.name = sourceName.Equals(string.Empty) ? this.id.ToString() : sourceName;
        }
        /// <summary>
        /// Reads file with synonyms from Ripicts format (word, syn1;raiing1,syn2;raiting2 etc.)
        /// </summary>
        /// <param name="filename">The filename.</param>
        /// <param name="datastructure">The in memory storage structure.</param>
        /// <exception cref="System.ArgumentNullException">data structure must me initialized and could not be null</exception>
        /// <exception cref="System.IO.FileNotFoundException">Passed filename with keywords not found.</exception>
        /// <exception cref="System.IO.IOException">Failed to read file.</exception>
        public void ReadFile(string filename, ref IinMemoryStorageStructure datastructure)
        {
            if (datastructure == null)
            {
                throw new ArgumentNullException("datastructure must me initialized and could not be null");
            }

            if (!File.Exists(filename))
            {
                throw new FileNotFoundException("Passed filename with keywords not found.", filename);
            }

            int stringCounter = 0;
            using (StreamReader reader = new System.IO.StreamReader(filename))
            {
                KeywordValidator validator = new KeywordValidator();
                while (!reader.EndOfStream)
                {
                    stringCounter++;
                    var input = reader.ReadLine();

                    // empty string ignore them
                    if (!input.Trim().Equals(string.Empty))
                    {
                        string keyword;
                        var synRelevanceCollection = new List<Tuple<string, int>>();

                        if (input.IndexOf(',') > 0)
                        {
                            keyword = input.Substring(0, input.IndexOf(","));
                            var collection = input.Substring(input.IndexOf(",") + 1).Trim().Split(',').Select(s => s.Trim()).ToArray();

                            for (int i = 0; i < collection.Length; i++)
                            {
                                var element = collection[i];
                                var pair = element.Trim().Split(';');
                                if (pair.Length > 0 && validator.Validate(pair[0]))
                                {
                                    var synvalue = pair[0].Trim();
                                    int relValue = 0;
                                    if (pair.Length > 1)
                                    {
                                        int.TryParse(pair[1], out relValue);
                                    }

                                    if (!synvalue.Equals(string.Empty))
                                    {
                                        synRelevanceCollection.Add(new Tuple<string, int>(synvalue, relValue));
                                    }
                                }
                                else
                                {
                                    throw new FormatException(string.Format("Format on the line {0} is not right. Missing ';' symbol or value '{1}' illegal.", stringCounter, element));
                                }
                            }
                        }
                        else
                        {
                            // means that this is just a word without synonyms;
                            keyword = input.Trim();
                        }

                        try
                        {
                            datastructure.AddSynonyms(keyword, synRelevanceCollection.ToArray());
                        }
                        catch (Exception ex)
                        {
                            throw new Exception(string.Format("Format on the line {0}.", stringCounter), ex);
                        }
                    }
                }
            }
        }