/// <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())); } }
/// <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)); }