private bool SkipRows(CsvReader reader, int numRows)
        {
            IList<string> row;
            int i = 0;
            while (reader.ReadRow(out row))
            {
                i++;
                if (i == numRows)
                    break;
            }

            return i == numRows;
        }
        public void Import(object importSettingsViewModel, Stream stream, CogProject project)
        {
            var reader = new CsvReader(new StreamReader(stream), ',');
            if (!SkipRows(reader, 5))
            {
                project.Meanings.Clear();
                project.Varieties.Clear();
                return;
            }

            var varieties = new List<Variety>();
            var meanings = new Dictionary<string, Meaning>();
            IList<string> varietyRow;
            while (reader.ReadRow(out varietyRow))
            {
                if (string.IsNullOrEmpty(varietyRow[0]))
                    break;

                var variety = new Variety(varietyRow[0].Trim());
                if (!SkipRows(reader, 2))
                    throw new ImportException("Metadata for a variety is incomplete.");

                Meaning curMeaning = null;
                IList<string> glossRow;
                while (reader.ReadRow(out glossRow) && glossRow.Any(s => !string.IsNullOrEmpty(s)))
                {
                    if (!string.IsNullOrEmpty(glossRow[0]))
                    {
                        string gloss = glossRow[0].Trim();
                        curMeaning = meanings.GetValue(gloss, () => new Meaning(gloss, null));
                    }
                    if (curMeaning == null)
                        throw new ImportException("A gloss is missing.");

                    string wordStr = glossRow[1].Trim();
                    if (!string.IsNullOrEmpty(wordStr))
                        variety.Words.Add(new Word(wordStr, curMeaning));
                }
                varieties.Add(variety);
            }

            project.Meanings.ReplaceAll(meanings.Values);
            project.Varieties.ReplaceAll(varieties);
        }
        public IEnumerable<Tuple<string, string>> Import(object importSettingsViewModel, Stream stream)
        {
            var mappings = new List<Tuple<string, string>>();
            var reader = new CsvReader(new StreamReader(stream), _delimiter);
            IList<string> mapping;
            while (reader.ReadRow(out mapping))
            {
                if (mapping.Count >= 2)
                {
                    string str1 = mapping[0].Trim();
                    string str2 = mapping[1].Trim();
                    if (string.IsNullOrEmpty(str1) || string.IsNullOrEmpty(str2))
                        throw new ImportException("An empty segment is not allowed.");
                    mappings.Add(Tuple.Create(str1, str2));
                }
            }

            return mappings;
        }