Пример #1
0
        /// <summary>
        /// Импорт CSV
        /// </summary>
        /// <param name="dbType"></param>
        /// <param name="fileName"></param>
        /// <param name="enc"></param>
        /// <param name="separator"></param>
        public void ImportFromCSV(DBType defaultDBType, CategoryType defaultCatType, string fileName, Encoding enc, char separator)
        {
            //
            Category      currentCategory      = null;
            DeviceType    curentCategoryDevice = DeviceType.None;
            StringBuilder warnings             = new StringBuilder();
            Dictionary <ProgramId, ProgramId> sourceProgIdToProgId = new Dictionary <ProgramId, ProgramId>();
            //
            var parser = new CsvParser();

            parser.separator = separator;
            int iLineCounter = 0;
            //
            var catType = defaultCatType;
            var dbType  = defaultDBType;

            foreach (var line in parser.Parse(fileName, enc))
            {
                iLineCounter++;

                if (line.Count < 2 || line[0].Trim() == "")
                {
                    warnings.AppendLine(LangStuffs.Lang.Phrase("Пустая строка: {0}", iLineCounter));
                    continue;
                }
                //проверяем первое поле ($тип прибора)
                var m = regex1.Match(line[0]);
                if (m == null || m.Groups.Count < 2)//неизвестная строка
                {
                    warnings.AppendLine(LangStuffs.Lang.Phrase("Строка {0} в неизвестном формате", iLineCounter));
                    continue;
                }
                //получаем тип прибора
                DeviceType device = ParseDeviceType(m.Groups["device"].Value);
                if (device == DeviceType.Any || device == DeviceType.None)
                {
                    warnings.AppendLine(LangStuffs.Lang.Phrase("Неизвестный тип прибора в строке {0}", iLineCounter));
                    continue;
                }
                //новая категория?
                if (m.Groups["category"].Value == "$")
                {
                    try
                    {
                        catType = defaultCatType;
                        dbType  = defaultDBType;

                        currentCategory      = ParseCategory(line, device, ref catType, ref dbType, warnings);
                        curentCategoryDevice = device;
                        var isNewCategory = true;
                        //ищем категорию с таким же именем
                        var key = new DBKey(dbType, ItemType.Category, device);
                        foreach (var cat in  (DB.FileDict[key] as Categories).Values)
                        {
                            if (cat.Type == currentCategory.Type)
                            {
                                if (cat.GetName()[Lang.RuLCID] == currentCategory.GetName()[Lang.RuLCID])//уже существующая категория
                                {
                                    currentCategory = cat;
                                    //обновляем имена
                                    cat.SetName(currentCategory.GetName());
                                    isNewCategory = false;
                                    break;
                                }
                            }
                        }
                        //если новая категория - добавляем
                        if (isNewCategory)
                        {
                            DB.AddCategory(dbType, device, currentCategory);
                        }
                    }
                    catch (Exception ex)
                    {
                        currentCategory      = null;
                        curentCategoryDevice = DeviceType.None;
                        warnings.AppendLine(LangStuffs.Lang.Phrase("Строка {0}: {1}", iLineCounter, ex.Message));
                        continue;
                    }
                }
                else
                {
                    //новая программа
                    if (currentCategory == null || curentCategoryDevice != device)
                    {
                        warnings.AppendLine(LangStuffs.Lang.Phrase("В строке {0} найдена программа, но неизвестно, к какой категории она относится", iLineCounter));
                        continue;
                    }
                    try
                    {
                        ProgramData data;
                        Dictionary <int, ProgramName> names;
                        int       sourceProgIndex;
                        string    key;
                        ProgramId progId;
                        //парсим
                        ParseProgram(line, device, out data, out names, out key, out sourceProgIndex);
                        ProgramId      sourceProgId = new ProgramId(dbType, device, sourceProgIndex);
                        ProgramKeyName keyName      = new ProgramKeyName(sourceProgId, key);
                        //
                        if (data != null)//если это не ссылка
                        {
                            //если экспорт идет в служебную БД, необходимо шифровать данные
                            if (DB.EncodeNeeded(dbType, device))
                            {
                                data.Encode(device);
                            }
                            //ищем полное русское название программы
                            //var fullName = names[Lang.RuLCID].FullName;
                            var names2 = DB.GetProgramNames(dbType, device, sourceProgIndex);
                            if (names2 != null)
                            {
                                if (device == DeviceType.DETA_AP_4 || device == DeviceType.DETA_Ritm_4)
                                {
                                    foreach (var LCID in Lang.GetAccessibleLanguages())
                                    {
                                        foreach (var name2 in names[Lang.ISONameToLCID(LCID)].FullName)
                                        {
                                            if (name2.ToString().Length > 30 || name2.ToString().Length == 0)
                                            {
                                                warnings.AppendLine(LangStuffs.Lang.Phrase("В строке {0} не указано название программы", iLineCounter));
                                                continue;
                                            }
                                        }
                                    }
                                }
                                else
                                {
                                    foreach (var LCID in Lang.GetAccessibleLanguages())
                                    {
                                        if (LCID == "EN" || LCID == "DE" || LCID == "FR" || LCID == "ES" || LCID == "RU")
                                        {
                                            foreach (var name2 in names[Lang.ISONameToLCID(LCID)].FullName)
                                            {
                                                if (name2.ToString().Length > 30 || name2.ToString().Length == 0)
                                                {
                                                    warnings.AppendLine(LangStuffs.Lang.Phrase("В строке {0} не указано название программы", iLineCounter));
                                                    continue;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            //добавляем программу в БД
                            progId = DB.AddOrUpdateProgram(dbType, device, data, keyName, sourceProgIndex, Lang.RuLCID);
                            //запоминаем перекодировку
                            if (sourceProgId.id >= 0)
                            {
                                sourceProgIdToProgId.Add(sourceProgId, progId);
                            }
                            //добавляем имена
                            foreach (var p in names)
                            {
                                var oldName = DB.GetProgramName(progId, p.Key);
                                if (oldName == null)
                                {
                                    DB.SetProgramName(p.Value, progId, p.Key);
                                }
                                else
                                {
                                    //сохраняем старый объект имени, потому что там могут быть описания и рекомендации
                                    oldName.FullName  = p.Value.FullName;
                                    oldName.ShortName = p.Value.ShortName;
                                    DB.SetProgramName(oldName, progId, p.Key);
                                }
                            }
                        }
                        else
                        {
                            //это была ссылка на другую программу
                            if (!sourceProgIdToProgId.ContainsKey(sourceProgId))
                            {
                                throw new Exception(Lang.Phrase("Найдена ссылка на программу, но программы с таким кодом нет.") + string.Format(" Device={0} DBType={1} ProgId={2}", sourceProgId.device, sourceProgId.dbType, sourceProgId.id));
                            }
                            progId = sourceProgIdToProgId[sourceProgId];
                        }
                        //добавляем в категорию
                        var exists = false;
                        foreach (var pi in currentCategory.ProgIds)
                        {
                            if (pi.Equals(progId))
                            {
                                exists = true;
                                break;
                            }
                        }
                        if (!exists)//если программы нет в этой категории, добавляем
                        {
                            currentCategory.AddProgId(progId);
                        }
                    }
                    catch (Exception ex)
                    {
                        warnings.AppendLine(LangStuffs.Lang.Phrase("Строка {0}: {1}", iLineCounter, ex.Message));
                        continue;
                    }
                }
            }

            if (warnings.Length > 0)
            {
                throw new NonCriticalException(Lang.Phrase("Импорт выполнен, со следующими замечаниями:\r\n{0}", warnings.ToString()));
            }
        }
Пример #2
0
 /// <summary>
 /// Импорт CSV с автоопределением разделителей
 /// </summary>
 /// <param name="dbType"></param>
 /// <param name="fileName"></param>
 /// <param name="enc"></param>
 public void ImportFromCSV(DBType dbType, CategoryType catType, string fileName, Encoding enc)
 {
     ImportFromCSV(dbType, catType, fileName, enc, CsvParser.AutoDetectSeparator(fileName, enc));
 }