Имя: Пароль:
1C
1С v8
Нетривиальная загрузка данных из TXT
0 wtlz
 
06.11.13
17:31
Всем привет!
Появилась интересная задачка по загрузке из текстового файла (текст будет ниже). Требуется создать в справочнике иерархию групп. Думал, думал и до сих пор думаю. Может кто-нибудь подкинет гениальную идею или типовое решение (если уже было)?

1. ЭЛЕКТРОГЕНЕРАТОРНЫЕ УСТАНОВКИ (ЭГУ).
1.1. GEKO.
1.1.1. DIE Professionellen (Профессиональные) ЭГУ
1.1.1.1. Super Silent (до 15 кВА) ЭГУ
1.1.2. Die Robusten (БЫТОВЫЕ) ЭГУ
1.1.3. DIN (специальные) ЭГУ
1.1.4. GEKO DEUTZ открытые ЭГУ
1.1.5. GEKO DEUTZ тихие ЭГУ
1.2. EISEMANN
1.2.1. Ecoline ЭГУ
1.2.2. High Protection ЭГУ
1.2.3. Profiline
1.2.4. Schweiss (cварка) ЭГУ
1.2.5. Topline ЭГУ
1.2.6. ISEMANN (Дополнительное оборудование)
1.2.6.1. Фонари портативные электрические
и т.д.
1 Нуф-Нуф
 
06.11.13
17:31
парсить 1.1.1.1. и исходя из этого определять иерархию
2 zak555
 
06.11.13
17:32
дерево ?
3 wtlz
 
06.11.13
17:36
(1) подробнее, если можно.
4 wtlz
 
06.11.13
17:36
что "дерево"?
5 Нуф-Нуф
 
06.11.13
17:37
(3) находишь первый пробел в строке, получаешь все символы до этой позиции и разбираешь строку вида "х.х.х.х..." по разделителям "."
6 Михаил Козлов
 
06.11.13
17:37
(4) Грузите файл в дерево. Из дерева - в справочник.
7 wtlz
 
06.11.13
17:39
(5) получается по количеству точек уровень можно определить
8 mistеr
 
06.11.13
17:42
Спорю, что оператор набьет быстрее, чем ТС осилит здешние подсказки.
9 Mashinist
 
06.11.13
17:43
(0)Чего тут интересного... садись да пиши
10 wtlz
 
06.11.13
17:45
(8) 1000 строк, может измениться
(9) уже пишу
(6) как определить принадлежность?
11 wtlz
 
06.11.13
17:48
число может быть и двузначным
12 mistеr
 
06.11.13
17:52
(10) Нужна структура данных типа стек. Или рекурсия.
13 Baker_it
 
06.11.13
17:55
Что тут нетривиального? Дело на под часа с перекурами.
14 zak555
 
06.11.13
17:59
(12) рекурсии достаточно
15 zak555
 
06.11.13
18:00
(13) час ? о_О
16 wtlz
 
06.11.13
18:00
что-то туплю. как из n.n.n.n. вытащить n.n.n. ?
17 Нуф-Нуф
 
06.11.13
18:01
(11) хоть 10значное. получаешь числа от "." до "."
18 zak555
 
06.11.13
18:01
(16) ты понял, что дерево надо использовать ?
19 zak555
 
06.11.13
18:02
(17) а если число с плавающей точкой ?
20 Нуф-Нуф
 
06.11.13
18:03
(16)
Номер = "n.n.n.n.";
ПозицияТочки = Найти(Номер, ".");
ПервоеЧисло = Лев(Номер, ПозицияТочки);
ОставшийсяНомер = Прав(Номер, СтрДлина - ПозицияТочки).

и все это в цикле

(19) в сабже? плавающая точка?
21 wtlz
 
06.11.13
18:39
offtop: как код под спойлер засунуть:?
(20) СПАСИБО!
22 wtlz
 
06.11.13
18:48
На всякий случай выложу, вдруг кому-нибудь понадобится...
[CODE]
        Пока Стр <> Неопределено Цикл // строки читаются до символа перевода строки
            Стр = Текст.ПрочитатьСтроку();
            ВремКод = Лев(Стр,Найти(Стр, " ")-1);
            Наименование = Прав(Стр,СтрДлина(Стр)-Найти(Стр, " "));
            Уровень = СтрЧислоВхождений(ВремКод, ".");
            ВремКодРодителя = "";
            ОставшийсяНомер = ВремКод;
            Для Сч = 1 По Уровень-1 Цикл
                ПозицияТочки = Найти(ОставшийсяНомер, ".");
                ПервоеЧисло = Лев(ОставшийсяНомер, ПозицияТочки);
                ОставшийсяНомер = Прав(ОставшийсяНомер, СтрДлина(ОставшийсяНомер) - ПозицияТочки);
                ВремКодРодителя = "" + ВремКодРодителя + ПервоеЧисло;
            КонецЦикла;
            СпрГруппа = Справочники.Номенклатура.СоздатьГруппу();
            СпрГруппа.Наименование = Наименование;
            Если Таблица.Найти(ВремКодРодителя, "ВремКод") <> Неопределено Тогда
                СпрГруппа.Родитель = Таблица.Найти(ВремКодРодителя, "ВремКод").Ссылка;
            КонецЕсли;
            СпрГруппа.Записать();
            СтрокаТаблицы = Таблица.Добавить();
            СтрокаТаблицы.ВремКод = ВремКод;
            СтрокаТаблицы.ВремКодРодителя = ВремКодРодителя;
            СтрокаТаблицы.Наименование = Наименование;
            СтрокаТаблицы.Ссылка = СпрГруппа.Ссылка;
        КонецЦикла;    

[/CODE]
23 SUA
 
06.11.13
18:48
(20)СтрокиНомеров = СтрЗаменить(Номер,".",Символы.ПС)
и дальше обработать многострочный блок через СтрПолучитьСтроку()
24 wtlz
 
06.11.13
18:49
ну и перед циклом, конечно же:


    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("ВремКод",Новый ОписаниеТипов("Строка") ,"ВремКод");    
    Таблица.Колонки.Добавить("ВремКодРодителя",Новый ОписаниеТипов("Строка") ,"ВремКодРодителя");    
    Таблица.Колонки.Добавить("Наименование",Новый ОписаниеТипов("Строка") ,"Наименование");    
    Таблица.Колонки.Добавить("Ссылка",Новый ОписаниеТипов("СправочникСсылка.Номенклатура") ,"Ссылка");    
25 zak555
 
07.11.13
10:48
(22) у тебя одни группы в ТХТ ?
26 wtlz
 
08.11.13
15:47
(25) да. (22) похоже колонка с кодом родителя лишняя
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.