|   |   | 
| 
 | Анализ и выстраивание по подпунктам иеарархии. | ☑ | ||
|---|---|---|---|---|
| 0
    
        xipypg2012 22.12.14✎ 16:13 | 
        Подскажите кто нибудь реализовывал такие алгоритмы,или где можно подсмотреть. пример :
 1. Работы 1.1 Строительные работы 1.1.1 Работа 1 1.1.2 Работа 2 1.2 Монтажные работы 1.2.1 Работа 3 1.2.2 работа 4 Грубо говоря такая экселевская таблица, как можно оптимально проанализировать подобную нумерацию , и на базе нее выстроить иерархию | |||
| 1
    
        vicof 22.12.14✎ 16:14 | 
        Определяй уровень по количеству точек     | |||
| 2
    
        xipypg2012 22.12.14✎ 16:21 | 
        Если кто-то чтото на подобие организовывал, либо с цифрами или с буквами скинте плз)     | |||
| 3
    
        vicof 22.12.14✎ 16:23 | 
        (2) А мож еще дочку председателя колхоза за титьку потрогать дать?
 Давай сам делай, вопросы появятся отпишешь, в инете полно примеров работы с экселем. | |||
| 4
    
        xipypg2012 22.12.14✎ 16:29 | 
        да эт понятно что не трудно)) просто думать надо)))     | |||
| 5
    
        xipypg2012 22.12.14✎ 17:18 | 
        Просто по точкам не вариант.........надо анализировать цифры после точек.     | |||
| 6
    
        Лефмихалыч 22.12.14✎ 17:20 | 
        (0) чо там делать? Это ж в один проход решается. Добро бы они были перемешаны как попало...     | |||
| 7
    
        Лефмихалыч 22.12.14✎ 17:21 | 
        (4) о чем думать?
 Прочел строчку, оторвал все, что до первого пробела - это иерархия. Остальное - данные. Наливай, да пей... | |||
| 8
    
        НЕА123 22.12.14✎ 17:28 | 
        Чиселки = СтрЗаменить(СтрПолучитьСтроку(СтрЗаменить(строчкаЭхеля, " ",Символы.ПС),1),".",Символы.ПС);
 Для к = 1 по СтрЧислоСтрок(Чиселки) ...... | |||
| 9
    
        Лефмихалыч 22.12.14✎ 17:30 | 
        +(8) еще к этому надо приделать одно соответствие, в котором ключом будет "#.#.#", а значением - папка справочника. Чтобы запросы в цикле не гонять.     | |||
| 10
    
        Лефмихалыч 22.12.14✎ 17:32 | 
        единственная заморочка - это, если ты не знаешь, сколько уровней иерархии может быть. Тогда запись в справочник для каждой группы можно делать только после того, как до последних элементов дошел. Что тоже - задача тривиальная, раз они все по иерархии упорядочены     | |||
| 11
    
        cathode 22.12.14✎ 17:34 | 
        (7) Если сравнивать как строки, то "1.2.10" будет меньше, чем "1.2.2". Придется дополнительно извращаться с элементами иерархии.
 (0) Универсальное решение есть, называется алгоритм "натурального" сравнения строк. В PHP, например, есть функция natsort, которая делает именно то, что нужно. Вот вариант портирования функции сравнения из этой сортировки с C на 1С, но за абсолютную корректность и скорость работы поручиться не могу: // Проверяет, является ли переданный символ цифрой. // // Параметры: // Симв - Строка - символ. // // Возвращаемое значение: // Булево - признак того, что передана цифра. // // Примечание: см. libc.isdigit(). // Функция ЭтоЦифра(Знач Симв) Перем КодСимв; КодСимв = КодСимвола(Симв); Возврат (КодСимв <= 57 И КодСимв >= 48); КонецФункции // ЭтоЦифра() // Проверяет, является ли переданный символ пробельным. // // Параметры: // Симв - Строка - символ. // // Возвращаемое значение: // Булево - признак того, что передан пробельный символ. // // Примечание: см libc.isspace(). // Функция ЭтоПробельныйСимвол(Знач Симв) Возврат (Симв = " " Или Симв = Символы.Таб Или Симв = Символы.ВК Или Симв = Символы.ВТаб Или Симв = Символы.НПП Или Симв = Символы.ПС); КонецФункции // ЭтоПробельныйСимвол() // Сравнивает последовательности цифр по их значениям. При этом считается, // что последовательности не выровнены по длине цифрой 0. // // Параметры: // Стр1 - Строка - первая строка. // Стр2 - Строка - вторая строка. // // Возвращаемое значение: // Число: // -1 - первая строка меньше второй, // 0 - строки равны, // +1 - первая строка больше второй. // Функция СравнитьПравыеЦифровыеПоследовательности(Знач Стр1, Знач Стр2) Перем Сдвиг, ДлинаСтр1, ДлинаСтр2, СчСтр1, СчСтр2, Симв1, Симв2; Перем ЭтоЦифраСимв1, ЭтоЦифраСимв2; Сдвиг = 0; ДлинаСтр1 = СтрДлина(Стр1); ДлинаСтр2 = СтрДлина(Стр2); Если (ДлинаСтр1 <> 0) И (ДлинаСтр2 <> 0) Тогда СчСтр1 = 1; СчСтр2 = 1; Пока Истина Цикл Симв1 = Сред(Стр1, СчСтр1, 1); Симв2 = Сред(Стр2, СчСтр2, 1); ЭтоЦифраСимв1 = ЭтоЦифра(Симв1); ЭтоЦифраСимв2 = ЭтоЦифра(Симв2); Если Не ЭтоЦифраСимв1 И Не ЭтоЦифраСимв2 Тогда Возврат Сдвиг; ИначеЕсли Не ЭтоЦифраСимв1 Тогда Возврат -1; ИначеЕсли Не ЭтоЦифраСимв2 Тогда Возврат +1; ИначеЕсли Симв1 < Симв2 Тогда Если Сдвиг = 0 Тогда Сдвиг = -1; КонецЕсли; ИначеЕсли Симв1 > Симв2 Тогда Если Сдвиг = 0 Тогда Сдвиг = +1; КонецЕсли; ИначеЕсли (СчСтр1 >= ДлинаСтр1) Или (СчСтр2 >= ДлинаСтр2) Тогда Возврат Сдвиг; КонецЕсли; СчСтр1 = СчСтр1 + 1; СчСтр2 = СчСтр2 + 1; КонецЦикла; Иначе Возврат Сдвиг; КонецЕсли; КонецФункции // СравнитьПравыеЦифровыеПоследовательности() // Сравнивает последовательности цифр по их значениям. При этом считается, // что последовательности выровнены цифрами 0. // // Параметры: // Стр1 - Строка - первая строка. // Стр2 - Строка - вторая строка. // // Возвращаемое значение: // Число: // -1 - первая строка меньше второй, // 0 - строки равны, // +1 - первая строка больше второй. // Функция СравнитьЛевыеЦифровыеПоследовательности(Знач Стр1, Знач Стр2) Перем ДлинаСтр1, ДлинаСтр2, СчСтр1, СчСтр2, Симв1, Симв2; Перем ЭтоЦифраСимв1, ЭтоЦифраСимв2; ДлинаСтр1 = СтрДлина(Стр1); ДлинаСтр2 = СтрДлина(Стр2); Если (ДлинаСтр1 <> 0) И (ДлинаСтр2 <> 0) Тогда СчСтр1 = 1; СчСтр2 = 1; Пока (СчСтр1 <= ДлинаСтр1) Или (СчСтр2 <= ДлинаСтр2) Цикл Симв1 = Сред(Стр1, СчСтр1, 1); Симв2 = Сред(Стр2, СчСтр2, 1); ЭтоЦифраСимв1 = ЭтоЦифра(Симв1); ЭтоЦифраСимв2 = ЭтоЦифра(Симв2); Если Не ЭтоЦифраСимв1 И Не ЭтоЦифраСимв2 Тогда Возврат 0; ИначеЕсли Не ЭтоЦифраСимв1 Тогда Возврат -1; ИначеЕсли Не ЭтоЦифраСимв2 Тогда Возврат +1; ИначеЕсли Симв1 < Симв2 Тогда Возврат -1; ИначеЕсли Симв1 > Симв2 Тогда Возврат +1; КонецЕсли; СчСтр1 = СчСтр1 + 1; СчСтр2 = СчСтр2 + 1; КонецЦикла; КонецЕсли; Возврат 0; КонецФункции // СравнитьЛевыеЦифровыеПоследовательности() // Выполняет "натуральное" сравнение строк с учетом значений // последовательностей цифр в исходных строках. // // Параметры: // Стр1 - Строка - первая строка. // Стр2 - Строка - вторая строка. // УчитыватьРегистр - Булево - учитывать регистр букв. // // Возвращаемое значение: // Число: // -1 - первая строка меньше второй, // 0 - строки равны, // +1 - первая строка больше второй. // Функция СравнитьСтрокиНатурально(Знач Стр1, Знач Стр2, Знач УчитыватьРегистр = Истина) Экспорт Перем РезультатСравнения, СчСтр1, СчСтр2, Симв1, Симв2; СчСтр1 = 1; СчСтр2 = 1; Пока Истина Цикл Симв1 = Сред(Стр1, СчСтр1, 1); Симв2 = Сред(Стр2, СчСтр2, 1); // "Прогоняем" пробельные символы первой строки. Пока ЭтоПробельныйСимвол(Симв1) Цикл СчСтр1 = СчСтр1 + 1; Симв1 = Сред(Стр1, СчСтр1, 1); КонецЦикла; // "Прогоняем" пробельные символы второй строки. Пока ЭтоПробельныйСимвол(Симв2) Цикл СчСтр2 = СчСтр2 + 1; Симв2 = Сред(Стр2, СчСтр2, 1); КонецЦикла; Если ЭтоЦифра(Симв1) И ЭтоЦифра(Симв2) Тогда Если Симв1 = "0" Или Симв2 = "0" Тогда РезультатСравнения = СравнитьЛевыеЦифровыеПоследовательности(Сред(Стр1, СчСтр1), Сред(Стр2, СчСтр2)); Если РезультатСравнения <> 0 Тогда Возврат РезультатСравнения; КонецЕсли; Иначе РезультатСравнения = СравнитьПравыеЦифровыеПоследовательности(Сред(Стр1, СчСтр1), Сред(Стр2, СчСтр2)); Если РезультатСравнения <> 0 Тогда Возврат РезультатСравнения; КонецЕсли; КонецЕсли; КонецЕсли; Если (Симв1 = "") И (Симв2 = "") Тогда Возврат 0; КонецЕсли; Если Не УчитыватьРегистр Тогда Симв1 = ВРег(Симв1); Симв2 = ВРег(Симв2); КонецЕсли; Если Симв1 < Симв2 Тогда Возврат -1; ИначеЕсли Симв1 > Симв2 Тогда Возврат +1; КонецЕсли; СчСтр1 = СчСтр1 + 1; СчСтр2 = СчСтр2 + 1; КонецЦикла; КонецФункции // СравнитьСтрокиНатурально() Это правда, только сравнение строк. Сортировку нужно будет сделать самостоятельно. Если скорость будет маленькая, функции ЭтоЦифра и ЭтоПробельныйСимвол можно инлайнить. | |||
| 12
    
        cathode 22.12.14✎ 17:47 | 
        (0) Блин, надо было внимательно прочитать, чего человек хочет...
 Короче, (11) - это не совсем в ту степь. Отсортировать-то строки он отсортирует, а вот задачу построения иерархии не решает. | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |