список значений, еще раз к 1Сникам

[ Версия для печати ]
Добавить в Telegram Добавить в Twitter Добавить в Вконтакте Добавить в Одноклассники
  [ ОТВЕТИТЬ ] [ НОВАЯ ТЕМА ]
RusLAN
9.11.2006 - 13:43
Статус: Offline


Хохмач

Регистрация: 21.03.06
Сообщений: 683
0
типа уже всесь мозг запарил... с температурой видимо плохо думается...

теперь и вам предлагаю головоломку

короче есть строка вида:
{1|Число,абв"абв"|Строка,{2|Число2,{abc"abc"|Строка2}|СЗ2}|СЗ,3|Число3}

надо из нее сотворить список значений.

список значений ограничивается {}
значения в списке разделяютя запятыми, "|" отделяется представление от значения, СЗ может содержать вложенные списки значений на неограниченную глубину.
 
[^]
Yap
[x]



Продам слона

Регистрация: 10.12.04
Сообщений: 1488
 
[^]
Хня
9.11.2006 - 13:58
0
Статус: Offline


Шутник

Регистрация: 21.07.06
Сообщений: 15
паламалсо моск hz.gif
 
[^]
Евген
9.11.2006 - 14:12
0
Статус: Online


Гость


Главное: Регистрация
Вопросы: Помощь
Важное: Правила
Сообщения: Поиск

НЕ ФЛУДИТЬ!!! deal.gif
[^]
Misha7519
9.11.2006 - 14:19
0
Статус: Offline


в отпуске был

Регистрация: 6.10.05
Сообщений: 2184
RusLAN, ты абъясни... нахуя тибе это? why.gif
 
[^]
RusLAN
9.11.2006 - 14:55
0
Статус: Offline


Хохмач

Регистрация: 21.03.06
Сообщений: 683
Misha7519 шоб сформировать строку передать ее а потом из нее СЗ собрать. в кратце. стандартный метод ВСтрокуСРазделителями хреново работает - 1-е не сохраняет представления, 2-е на понимает вложения
 
[^]
RusLAN
14.11.2006 - 14:38
0
Статус: Offline


Хохмач

Регистрация: 21.03.06
Сообщений: 683
я таки сделал это! sm_biggrin.gif
если каму инетересно могу выложить результаты своих мучений smile.gif
 
[^]
stronciy
14.11.2006 - 14:39
0
Статус: Offline


а тебе не похуй?

Регистрация: 14.08.06
Сообщений: 2700
Ну давай.
 
[^]
RusLAN
14.11.2006 - 14:56
0
Статус: Offline


Хохмач

Регистрация: 21.03.06
Сообщений: 683
//---------------------------------------
//рассчитывает длину многострочной строки
Функция глДлинаСтроки(стр) Экспорт
дл=0;

Для сч=1 По СтрКоличествоСтрок(стр) Цикл
дл=дл+СтрДлина(СтрПолучитьСтроку(стр,сч));
КонецЦикла;

Возврат дл;
КонецФункции //глДлинаСтроки

//---------------------------------------
//возвращает символ из многострочной строки
Функция глПолучитьСимволСтроки(стр,ном) Экспорт
дл=0;
КС=СтрКоличествоСтрок(стр);
Для сч=1 По КС Цикл
_стр=СтрПолучитьСтроку(стр,сч);
дл1=СтрДлина(_стр);

Если дл+дл1>=ном Тогда
Возврат Сред(_стр,ном-дл,1);
КонецЕсли;//

дл=дл+дл1;
КонецЦикла;
КонецФункции //глПолучитьСимволСтроки

//---------------------------------------
//производит разбиение на подстроки _зн длиной максДл
//и слияние с стр
Функция глРазбитьНаПодстроки(стр,_зн,максДл) Экспорт
длСтр=СтрДлина(СтрПолучитьСтроку(стр,СтрКоличествоСтрок(стр)));

КоличествоСтрок=СтрКоличествоСтрок(стр);

Для сч=1 По СтрКоличествоСтрок(_зн) Цикл
_зн1=СтрПолучитьСтроку(_зн,сч);

Пока СтрДлина(_зн1)<>0 Цикл
длЗн=СтрДлина(_зн1);

Если длСтр+длЗн>максДл Тогда
ост=максДл-длСтр;
стр=стр+Лев(_зн1,ост);
_зн1=Сред(_зн1,ост+1);

стр=стр+РазделительСтрок;
КоличествоСтрок=КоличествоСтрок+1;
Иначе
стр=стр+_зн1;
_зн1="";
КонецЕсли;//

длСтр=СтрДлина(СтрПолучитьСтроку(стр,КоличествоСтрок));
КонецЦикла;
КонецЦикла;

Возврат стр;
КонецФункции //глРазбитьНаПодстроки

//---------------------------------------
//производить преобразование сп в строку с разделителями
//включая вложеные списки значений (таблицы значений не понимает)
Функция глСпВСтрокуСРазделителями(сп) Экспорт
максДл=255;

стр="{";

Для сч=1 По сп.РазмерСписка() Цикл
предст="";
зн=сп.ПолучитьЗначение(сч,предст);

Если ТипЗначенияСтр(зн)="СписокЗначений" Тогда
зн=глСпВСтрокуСРазделителями(зн);
ИначеЕсли ТипЗначенияСтр(зн)="Строка" Тогда
зн=""""+зн+"""";
КонецЕсли;//

_зн=?(сч=1,"",",")+зн+?(предст<>"","|","")+предст;

стр=глРазбитьНаПодстроки(стр,_зн,максДл);
КонецЦикла;

Возврат стр+"}";
КонецФункции //глВСтрокуСРазделителями

//---------------------------------------
//получает значение из строки с разделителями
Функция глПолучитьЗначениеИзСпСРазделителями(стр,сч,предст="")
СтрокаОткрыта=0;

_стр="";
предст="";

ЭтоПредставление=0;

сч_пред=сч;

дл=глДлинаСтроки(стр);
Пока сч<=дл Цикл
_симв=глПолучитьСимволСтроки(стр,сч);

Если _симв="""" Тогда
Если СтрокаОткрыта=0 Тогда
СтрокаОткрыта=1;
Иначе
СтрокаОткрыта=0;
КонецЕсли;//
Иначе
Если СтрокаОткрыта=1 Тогда
//если строковое значение будем игнорировать все что внутри
Иначе
Если _симв="|" Тогда
ЭтоПредставление=1;
сч=сч+1;
Продолжить;
ИначеЕсли (_симв=",")
ИЛИ (_симв="}") Тогда
сч=сч-1;

Возврат _стр;
КонецЕсли;//
КонецЕсли;//

Если ЭтоПредставление=0 Тогда
_стр=_стр+_симв;
Иначе
предст=предст+_симв;
КонецЕсли;
КонецЕсли;//

сч_пред=сч;
сч=сч+1;
КонецЦикла;

Возврат _стр;
КонецФункции //глПолучитьЗначениеИзСпСРазделителями

//---------------------------------------
//формирует СЗ из строки с разделителями
Функция глСпИзСтрокиСРазделителями(стр,сч=1,СписокОткрыт=0) Экспорт
сп=СоздатьОбъект("СписокЗначений");

дл=глДлинаСтроки(стр);

Пока сч<=дл Цикл
_симв=глПолучитьСимволСтроки(стр,сч);

предст="";
Если _симв="{" Тогда
СписокОткрыт=СписокОткрыт+1;
Если СписокОткрыт>1 Тогда
сч=сч+1;

зн=глСпИзСтрокиСРазделителями(стр,сч,СписокОткрыт);

_симв1=глПолучитьСимволСтроки(стр,сч);
Если _симв1="|" Тогда
//представление списка значений
Для сч1=сч+1 По дл Цикл
_симв1=глПолучитьСимволСтроки(стр,сч1);
Если (_симв1=",")
Или (_симв1="}") Тогда
Прервать;
КонецЕсли;

предст=предст+_симв1;
сч=сч1;
КонецЦикла;
КонецЕсли;//
Иначе
сч=сч+1;
Продолжить;
КонецЕсли;//
ИначеЕсли _симв="}" Тогда
СписокОткрыт=СписокОткрыт-1;

сч=сч+1;

Возврат сп;
ИначеЕсли _симв="," Тогда
//пропустим разделитель значений
сч=сч+1;
Продолжить;
Иначе
зн=глПолучитьЗначениеИзСпСРазделителями(стр,сч,предст);
КонецЕсли;//

сп.ДобавитьЗначение(зн,?(предст="",зн,предст));

сч=сч+1;
КонецЦикла;//

Возврат 0;
КонецФункции //глСпИзСтрокиСРазделителями

//*******************************************
Процедура Сформировать()
//тестирование преобразований
сп=СоздатьОбъект("СписокЗначений");
сп.ДобавитьЗначение(1,"Число");
сп.ДобавитьЗначение("абв","Строка");

сп2=СоздатьОбъект("СписокЗначений");
сп2.ДобавитьЗначение(2,"Число2");

сп3=СоздатьОбъект("СписокЗначений");
сп3.ДобавитьЗначение("abc");
сп3.ДобавитьЗначение("efg");

сп2.ДобавитьЗначение(сп3,"СЗ2");
сп2.ДобавитьЗначение("{|}");

сп.ДобавитьЗначение(сп2,"СЗ");
сп.ДобавитьЗначение(3,"Число3");

стр=глСпВСтрокуСРазделителями(сп);
Сообщить(стр);

_сп=глСпИзСтрокиСРазделителями(стр);

//при наличии компоненты ExtForms
Сервис = СоздатьОбъект("Сервис");
Сервис.ВыбратьЗначение(_сп,"","Тестовый выбор значения",1);
КонецПроцедуры
 
[^]
Aprior
14.11.2006 - 17:26
0
Статус: Online


Гость


Главное: Регистрация
Вопросы: Помощь
Важное: Правила
Сообщения: Поиск

RusLAN, твой пример на каком языке?
и тебе нужно на каком языке программа.. и программа ли?
[^]
stronciy
14.11.2006 - 17:48
0
Статус: Offline


а тебе не похуй?

Регистрация: 14.08.06
Сообщений: 2700
Это колыбельная сисадмина его сыну?


М
3х5


Это сообщение отредактировал toper - 14.11.2006 - 18:21
 
[^]
Aprior
14.11.2006 - 17:48
0
Статус: Online


Гость


Главное: Регистрация
Вопросы: Помощь
Важное: Правила
Сообщения: Поиск

Цитата (ПерецЪнах @ 14.11.2006 - 19:46)
Aprior
Это блиааааать 1с... глюк такой

о нет.. 1c scary.gif... увы я пас -- ни знайу я такова языка sad.gif

на чём другом может и помог бы
[^]
RusLAN
15.11.2006 - 09:46
0
Статус: Offline


Хохмач

Регистрация: 21.03.06
Сообщений: 683
Aprior
дык порешал ужо! cool.gif
и результаты - мож каму пригадитса! cheer.gif
 
[^]
Понравился пост? Еще больше интересного в Телеграм-канале ЯПлакалъ!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста, или зарегистрируйтесь, если не зарегистрированы.
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) Просмотры темы: 1433
0 Пользователей:
[ ОТВЕТИТЬ ] [ НОВАЯ ТЕМА ]


 
 



Активные темы






Наверх