-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparserV8i.os
More file actions
105 lines (90 loc) · 5.98 KB
/
parserV8i.os
File metadata and controls
105 lines (90 loc) · 5.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
Функция ЗаписатьРезультатВФайл(ИмяФайла,Данные)
Текст = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
Текст.Записать(Данные);
Текст.Закрыть();
КонецФункции // ЗаписатьРезультатВФайл(ИмяФайла,Данные)
Функция ТекстИниФайла(ИниФайл)
Если Не ИниФайл.Существует() Тогда
ВызватьИсключение "Не найден ини файл "+ИниФайл.ПолноеИмя;
КонецЕсли;
ТекстИни = Новый ЧтениеТекста(ИниФайл.ПолноеИмя, "utf-8");
Текст = ТекстИни.Прочитать();
Если ПустаяСтрока(Текст) Тогда
ВызватьИсключение "Из ини файла ничего не прочитано"
Иначе
Возврат Текст;
КонецЕсли;
КонецФункции
/// Объединяет строки из массива в строку с разделителями.
//
// Параметры:
// ИмяИНИФайла - Строка - Имя файла со списком баз
//
// Возвращаемое значение:
// Соответствие - Список баз, где: Ключ - имя базы, Значение: Структура с параметрами соединения
//
Функция ПолучитьСписокБаз(ИмяИНИФайла) Экспорт
Данные = ТекстИниФайла(Новый Файл(ИмяИНИФайла));
РегВыражениеСписокБаз = новый РегулярноеВыражение("\[[^\]\r\n]+](?:\r?\n(?:[^\[\r\n].*)?)*");
РегВыражениеПереносСтрок = новый РегулярноеВыражение("\r\n");
РегВыражениеЗначения = новый РегулярноеВыражение("(=|;)(?=(?:[^\""]*\""[^\""]*\"")*(?![^\""]*\""))");
Базы = РегВыражениеСписокБаз.НайтиСовпадения(Данные);
СписокБаз = Новый Соответствие;
Для каждого База из Базы Цикл
МассивСтр = РегВыражениеПереносСтрок.Разделить(База.Значение);
СтруктураПути = Новый Структура();
Для каждого Стр из МассивСтр Цикл
Если СокрЛП(Стр) = "" Тогда
Продолжить;
КонецЕсли;
Если (Лев(Стр, 1) = "[") Тогда
СтруктураПути.Вставить("Name",Сред(Стр,2,СтрДлина(Стр)-2));
ИначеЕсли ВРег(Лев(Стр, 7)) = ВРег("Connect") Тогда
СтрАдрес = Сред(Стр,9);
РезАдрес = РегВыражениеЗначения.Разделить(СтрАдрес);
СтруктураСоединения = Новый Структура();
Если РезАдрес.Количество() = 5 Тогда
СтруктураСоединения.Вставить(РезАдрес[0],РезАдрес[2]);
ИначеЕсли РезАдрес.Количество() = 9 Тогда
СтруктураСоединения.Вставить(РезАдрес[0],РезАдрес[2]);
СтруктураСоединения.Вставить(РезАдрес[4],РезАдрес[6]);
КонецЕсли;
СтруктураАдреса = Новый Структура;
СтруктураАдреса.Вставить("String",Стр);
СтруктураАдреса.Вставить("Structure",СтруктураСоединения);
СтруктураПути.Вставить("Connect",СтруктураАдреса);
Иначе
ПозицияРавно = СтрНайти(Стр,"=");
СтруктураПути.Вставить(Сред(Стр,1,ПозицияРавно-1),Сред(Стр,ПозицияРавно+1));
КонецЕсли;
КонецЦикла;
СписокБаз.Вставить(СтруктураПути.Name,СтруктураПути);
КонецЦикла;
Возврат СписокБаз;
КонецФункции
/// Объединяет строки из массива в строку с разделителями.
//
// Параметры:
// ИмяИНИФайла - Строка - Имя файла для записи списка баз;
// СписокБаз - Соответствие - Список баз (получаются через ПолучитьСписокБаз).
//
// Возвращаемое значение:
// Булево - Пока заглушка, всегда Истина
//
Функция ЗаписатьСписокБаз(ИмяИНИФайла,СписокБаз) Экспорт
Данные = "";
Для каждого База Из СписокБаз Цикл
СтруктураАдреса = База.Значение;
Для каждого Часть Из СтруктураАдреса Цикл
Если Часть.Ключ = "Name" Тогда
Данные = Данные + Символы.ВК + Символы.ПС + "[" + Часть.Значение + "]";
ИначеЕсли Часть.Ключ = "Connect" Тогда
Данные = Данные + Символы.ВК + Символы.ПС + Часть.Значение.String;
Иначе
Данные = Данные + Символы.ВК + Символы.ПС + Часть.Ключ + "=" + Часть.Значение;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ЗаписатьРезультатВФайл(ИмяИНИФайла,СокрЛП(Данные));
Возврат Истина;
КонецФункции // ЗаписатьСписокБаз()