Доброго времени ВСЕМ!
подскажите, нужно разложить строку, в которой содержатся пробелы на значения и их занести в соответствие структуры
Ругается
Метод объекта не обнаружен (Вставить)
ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
подскажите, нужно разложить строку, в которой содержатся пробелы на значения и их занести в соответствие структуры
&НаСервере
Функция РазложитьСтроку(Знач Стр, Разделитель = ",")
МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
|Время, Длит, Номер, CallerID, Dir, DirEx");
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
п=0;
Для Каждого ЭлементСтруктуры из МассивСтрок Цикл
Пока 1=1 Цикл
//Сообщить(Элемент.Ключ + ": " + Элемент.Значение);
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ,Стр);
Возврат МассивСтрок;
КонецЕсли;
ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
п=п+1;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецФункции
ПоказатьРугается
Метод объекта не обнаружен (Вставить)
ЭлементСтруктуры.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
По теме из базы знаний
- Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке
- Кодирование / декодирование в Base58 без использования внешних компонент
- Обзор полезных методов БСП 3.1.4
- Наука о чеках. Глава 2. Обработка для просмотра структуры и значений параметров кассовых чеков в json-файле
- Особенности работы с COM-соединением
Найденные решения
Из файла видно, что каждый показатель начинается с определенного символа в строке, кроме трех последних показателей, поэтому можно попробовать сделать так:
Функция ПолучитьСтруктуру(Стр,Разделитель);
МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
|Время, Длит, Номер, CallerID, Dir, DirEx");
МассивСтрок.Вставить("F",СокрЛП(Сред(Стр,1,2)));
МассивСтрок.Вставить("CRN1CRN2",СокрЛП(Сред(Стр,3,9)));
МассивСтрок.Вставить("Orig",СокрЛП(Сред(Стр,12,5)));
МассивСтрок.Вставить("Dest",СокрЛП(Сред(Стр,17,5)));
МассивСтрок.Вставить("Дата",СокрЛП(Сред(Стр,22,11)));
МассивСтрок.Вставить("Время",СокрЛП(Сред(Стр,33,9)));
МассивСтрок.Вставить("Длит",СокрЛП(Сред(Стр,42,9)));
МассивСтрок.Вставить("Номер",СокрЛП(Сред(Стр,51,21)));
// Для остальной строки разбор по предыдущему методу
ДоразложитьСтроку(СокрЛП(Сред(Стр,72,СтрДлина(Стр)-72))," ",МассивСтрок);
КонецФункции
Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Ложь);
СоответствиеКлючаПоказателю = Новый Соответствие;
СоответствиеКлючаПоказателю.Вставить(1,"CallerID");
СоответствиеКлючаПоказателю.Вставить(2,"Dir");
СоответствиеКлючаПоказателю.Вставить(3,"DirEx");
ЭтоПропуск = Ложь;
Показатель = 1;
Для каждого Подстрока из МассивПодстрок Цикл
Если ЗначениеЗаполнено(Подстрока) Тогда
ЭтоПропуск = Ложь;
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
Показатель = Показатель + 1;
Иначе
Если ЭтоПропуск Тогда
Продолжить;
Иначе
ЭтоПропуск = Истина;
Показатель = Показатель + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
переправил так:
если все поля в строке заполнены(по чсилу полей в структуре) - структура заполняется как надо - каждому значению свое значение. Но, вот если в строке например поле = значению в стркт. Номер пустое, но параметры на 1 сдвигаются.
Как избажать это сдвижение?
Пока 1=1 Цикл
Для Каждого ЭлементСтруктуры из МассивСтрок Цикл
//Сообщить(Элемент.Ключ + ": " + Элемент.Значение);
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Вставить(ЭлементСтруктуры.Ключ,Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Вставить(ЭлементСтруктуры.Ключ, Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
п=п+1;
КонецЦикла;
КонецЦикла;
Показатьесли все поля в строке заполнены(по чсилу полей в структуре) - структура заполняется как надо - каждому значению свое значение. Но, вот если в строке например поле = значению в стркт. Номер пустое, но параметры на 1 сдвигаются.
Как избажать это сдвижение?
Посмотрите в сторону процедуры РазложитьСтрокуВМассивПодстрок() как писал mymyka, есть в каждой типовой конфигурации или в БСП. Применив к Вашей строке указанную функцию с разделителем " " получите массив слов с индексами соответствующими порядку этих слов в переданной строке. А дальше хоть в свою структуру вставляйте хоть что делайте.
PS Пока 1=1 Цикл, лучше уж заменить на Пока Истина Цикл.
PS Пока 1=1 Цикл, лучше уж заменить на Пока Истина Цикл.
(12) SPID, смотрите ссылку на фото - так яснее гораздо. Фишка в том, что если поле номер пусто, то количество пробелов там=
= 22 символа (пробела). Так может задать условие что если количество в строке более или равно 22 пробела то это тоже как поле.
Но как такое реализовать?
= 22 символа (пробела). Так может задать условие что если количество в строке более или равно 22 пробела то это тоже как поле.
Но как такое реализовать?
(13) реализовать такое не проблема. пишите условие, что если не 22, ну и т.п. Дело не в этом, а в том, чтобы сделать это все нормально работающим. Но если у вас файл не имеет строгой разметки, то как-то сомнительно, что все будет нормально работать. Где гарантия, что будет всегда 22 пробела? Мой совет: данные получайте другим путем(другого формата) . Ну и также можно попробовать считать это файл как текстовый с разделителями через ODBC, но думаю это не вариант.
Можно резать от строки уже записанные реквизиты и проверять разницу между СокрЛ(СтрДлина(ОстатокСтроки)) и СтрДлина(ОстатокСтроки). Если вариант с СокрЛ сильно короче, значит был пропущен реквизит, причем пофиг сколько там было пробелов. Пишем в структуру значение текущего реквизита = "", режем ОстатокСтроки до СокрЛ(ОстатокСтроки) и переходим к следующему ключу структуры.
Manticor, можете сюда скопировать разбираемую строку? Есть подозрение, что они у вас одной длины все, просто каждое поле начинается со своей стьрого фиксированной позиции. Если это так, можно изобразить нечто вроде:
Стр=НашаСтрока;
Стр1=Сред(НашаСтрока,1,4);
Стр2=Сред(НашаСтрока,8,10);
и т.д.
...
НашаСтруктура.F=Стр1;
НашаСтруктура.Ква=Стр2;
....
Возврат НашаСтруктура;
Стр=НашаСтрока;
Стр1=Сред(НашаСтрока,1,4);
Стр2=Сред(НашаСтрока,8,10);
и т.д.
...
НашаСтруктура.F=Стр1;
НашаСтруктура.Ква=Стр2;
....
Возврат НашаСтруктура;
так же можно посмотреть все туже функцию РазложитьСтрокуВМассивПодстрок, там есть параметр ПропускатьПустыеСтроки и если его передать в Ложь то строка типа
"поле1 поле2 поле3 поле4"
При вызове РазложитьСтрокуВМассивПодстрок(МояСтрока," ",Ложь) вернет массив где
"поле1"
"поле2"
" "
" "
" "
"поле3"
" "
"поле4"
Ну а дальше массив в цикле обходим, и если встретили не заполнено значение, значит что то пропущено... ищем следующее заполненое...
"поле1 поле2 поле3 поле4"
При вызове РазложитьСтрокуВМассивПодстрок(МояСтрока," ",Ложь) вернет массив где
"поле1"
"поле2"
" "
" "
" "
"поле3"
" "
"поле4"
Ну а дальше массив в цикле обходим, и если встретили не заполнено значение, значит что то пропущено... ищем следующее заполненое...
(17) SPID, а это в какой конфе смотрите. Я вот смотрю из БП 2.0 и там не 3 параметра((
и тд
скиньте ваш вариант))
Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
Показатьскиньте ваш вариант))
Набросал примерно код, сам не проверял работоспособность
Функцию можно посмотреть, например, в конфигурации Документооборот
МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
|Время, Длит, Номер, CallerID, Dir, DirEx");
МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Ложь);
СоответствиеКлючаПоказателю = Новый Соответствие;
СоответствиеКлючаПоказателю.Вставить(1,"F");
СоответствиеКлючаПоказателю.Вставить(2,"CRN1CRN2");
СоответствиеКлючаПоказателю.Вставить(3,"Orig");
СоответствиеКлючаПоказателю.Вставить(4,"Dest");
СоответствиеКлючаПоказателю.Вставить(5,"Дата");
СоответствиеКлючаПоказателю.Вставить(6,"Время");
СоответствиеКлючаПоказателю.Вставить(7,"Длит");
СоответствиеКлючаПоказателю.Вставить(8,"Номер");
СоответствиеКлючаПоказателю.Вставить(9,"CallerID");
СоответствиеКлючаПоказателю.Вставить(10,"Dir");
СоответствиеКлючаПоказателю.Вставить(11,"DirEx");
ЭтоПропуск = Ложь;
Показатель = 1;
Для каждого Подстрока из МассивПодстрок Цикл
Если ЗначениеЗаполнено(Подстрока) Тогда
ЭтоПропуск = Ложь;
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
Показатель = Показатель + 1;
Иначе
Если ЭтоПропуск Тогда
Продолжить;
Иначе
ЭтоПропуск = Истина;
Показатель = Показатель + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ПоказатьФункцию можно посмотреть, например, в конфигурации Документооборот
что-то типа такого
(21)К сожалению, при 22 пробелах она создаст 22 элемента, а нужен только один.
Для примера,
МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("123 234пять_пробелов567", " ",Ложь); возвращает массив из 8 элементов.
Стр = "123 234 345 456 672";
Разделитель = " ";
СтруктураИтог = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
|Время, Длит, Номер, CallerID, Dir, DirEx");
Стр = СокрЛП(Стр);
Если Разделитель = " " Тогда
Для Каждого КлючИЗначение из СтруктураИтог Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
СтруктураИтог.Вставить(КлючИЗначение.Ключ,Стр);
Прервать;
ИначеЕсли Поз = 1 Тогда//значит первым стоит пробел
Если (СтрДлина(Стр) - СтрДлина(СокрЛ(Стр))) > 2 Тогда //Впереди как минимум 2 пробела
СтруктураИтог.Вставить(КлючИЗначение.Ключ,""); //создаем пустое значение для текущего ключа
Стр = СокрЛП(Стр);
Иначе //это просто пробел между словами
Стр = Прав(Стр,СтрДлина(Стр)-1);//так или иначе режем до первого значащего символа
КонецЕсли;
ИначеЕсли Поз > 1 Тогда
//Это нормальный параметр, режем, пишем и т.д.
СтруктураИтог.Вставить(КлючИЗначение.Ключ,Сред(Стр,1,Поз));
Стр = Прав(Стр,СтрДлина(Стр)-Поз);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для Каждого Элемент из СтруктураИтог Цикл
Сообщить(Элемент.КЛюч + ":"+Элемент.Значение);
КонецЦикла;
Показать(21)К сожалению, при 22 пробелах она создаст 22 элемента, а нужен только один.
Для примера,
МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок("123 234пять_пробелов567", " ",Ложь); возвращает массив из 8 элементов.
добавил в (23) рабочий пример. Правда к двум подряд пропущенным параметрам оно тоже не устойчиво, что несомненно минус, хотя можно сравнить длину "пробельной" части с максимальной длиной параметра и сделать вывод, если она больше, значит пропущено 2 параметра подряд(что делать с трем и больше я хз). А вообще идеально было бы вывести другой разделитель и не парить мозг.
З.Ы. (21) поизящнее, конечно, выглядит :Р
З.Ы. (21) поизящнее, конечно, выглядит :Р
(23) mymyka, да с такой строкой все хорошо проходит))
а если вот как из файла тянет попробовать ))
или
может формулу расчте поменять?
В моем случае двух пустых подряд параметров быть не может)), только номер.
(21) так не прокатывате, поскольку при разных строках разное количество параметров получается для сопоставления
а если вот как из файла тянет попробовать ))
Стр = "+ 0002000A NET 3 16.10.2012 09:09:06 00:00:28 103 88412558752 Внут 12";
или
- 000A000B 3 HOLD 16.10.2012 09:09:34 00:00:04 88412558752[] Внут 0
может формулу расчте поменять?
В моем случае двух пустых подряд параметров быть не может)), только номер.
(21) так не прокатывате, поскольку при разных строках разное количество параметров получается для сопоставления
Вот функция эта
// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину.
//
// Параметры:
// Строка - Строка - текст с разделителями;
// Разделитель - Строка - разделитель строк текста, минимум 1 символ;
// ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк.
// Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией:
// - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки
// включаются в результат.
// - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в
// случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а
// при других разделителях результатом функции будет пустой массив.
//
//
// Возвращаемое значение:
// Массив - массив строк.
//
// Примеры:
// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые строки;
// РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов;
// РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов;
// РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив;
// РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой);
// РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой);
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено) Экспорт
Результат = Новый Массив;
// для обеспечения обратной совместимости
Если ПропускатьПустыеСтроки = Неопределено Тогда
ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь);
Если ПустаяСтрока(Строка) Тогда
Если Разделитель = " " Тогда
Результат.Добавить("");
КонецЕсли;
Возврат Результат;
КонецЕсли;
КонецЕсли;
//
Позиция = Найти(Строка, Разделитель);
Пока Позиция > 0 Цикл
Подстрока = Лев(Строка, Позиция - 1);
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
Результат.Добавить(Подстрока);
КонецЕсли;
Строка = Сред(Строка, Позиция + СтрДлина(Разделитель));
Позиция = Найти(Строка, Разделитель);
КонецЦикла;
Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда
Результат.Добавить(Строка);
КонецЕсли;
Возврат Результат;
КонецФункции
Показать
Да, мой код будет некорректно работать(( так как между значениями идущими подряд так же несколько пробелов.
Формат файла видимо фиксированный по количеству символов, выложи файл (или его часть с несколькими строками. Все же придется считать пробелы.
Формат файла видимо фиксированный по количеству символов, выложи файл (или его часть с несколькими строками. Все же придется считать пробелы.
(30) SPID, по идее ваиант предложенный (23) mymyka - работает, но что то с подсчетом пробелов - косячит(также смещает, если брать строку из файла)
Прикрепленные файлы:
caller.txt
Из файла видно, что каждый показатель начинается с определенного символа в строке, кроме трех последних показателей, поэтому можно попробовать сделать так:
Функция ПолучитьСтруктуру(Стр,Разделитель);
МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
|Время, Длит, Номер, CallerID, Dir, DirEx");
МассивСтрок.Вставить("F",СокрЛП(Сред(Стр,1,2)));
МассивСтрок.Вставить("CRN1CRN2",СокрЛП(Сред(Стр,3,9)));
МассивСтрок.Вставить("Orig",СокрЛП(Сред(Стр,12,5)));
МассивСтрок.Вставить("Dest",СокрЛП(Сред(Стр,17,5)));
МассивСтрок.Вставить("Дата",СокрЛП(Сред(Стр,22,11)));
МассивСтрок.Вставить("Время",СокрЛП(Сред(Стр,33,9)));
МассивСтрок.Вставить("Длит",СокрЛП(Сред(Стр,42,9)));
МассивСтрок.Вставить("Номер",СокрЛП(Сред(Стр,51,21)));
// Для остальной строки разбор по предыдущему методу
ДоразложитьСтроку(СокрЛП(Сред(Стр,72,СтрДлина(Стр)-72))," ",МассивСтрок);
КонецФункции
Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Ложь);
СоответствиеКлючаПоказателю = Новый Соответствие;
СоответствиеКлючаПоказателю.Вставить(1,"CallerID");
СоответствиеКлючаПоказателю.Вставить(2,"Dir");
СоответствиеКлючаПоказателю.Вставить(3,"DirEx");
ЭтоПропуск = Ложь;
Показатель = 1;
Для каждого Подстрока из МассивПодстрок Цикл
Если ЗначениеЗаполнено(Подстрока) Тогда
ЭтоПропуск = Ложь;
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока);
Показатель = Показатель + 1;
Иначе
Если ЭтоПропуск Тогда
Продолжить;
Иначе
ЭтоПропуск = Истина;
Показатель = Показатель + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(32) SPID, а можете еще с нюаном подмоч) нужно еще номер разложить, тоесть если у нас номер вида 1111[2222], то их на 2 параметра делим номер1 =1111, номер 2= 2222
&НаСервере
Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
разд1 ="[";
разд2 ="]";
МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Истина);
СоответствиеКлючаПоказателю = Новый Соответствие;
СоответствиеКлючаПоказателю.Вставить(1,"Номер1");
СоответствиеКлючаПоказателю.Вставить(2,"Номер2");
СоответствиеКлючаПоказателю.Вставить(3,"CallerID1");
СоответствиеКлючаПоказателю.Вставить(4,"CallerID2");
СоответствиеКлючаПоказателю.Вставить(5,"Dir");
СоответствиеКлючаПоказателю.Вставить(6,"DirEx");
ЭтоПропуск = Ложь;
Показатель = 1;
Для каждого Подстрока из МассивПодстрок Цикл
Если ЗначениеЗаполнено(Подстрока) Тогда
/////// 84952230404[8884952230404]
Позиция = Найти(Подстрока, разд1);
Если Позиция > 0 Тогда
Пока Позиция > 0 Цикл
ПодПодстрока = Лев(Подстрока, Позиция - 3);
//Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда
// Результат.Добавить(ПодПодстрока);
//КонецЕсли;
Строка = Сред(Подстрока, Позиция + СтрДлина(разд1));
Позиция = Найти(Строка, разд2);
СубПодстрока = Прав(Подстрока, Позиция - 1);
// Подстрока.Добавить(СубПодстрока);
//КонецЦикла;
///////
ЭтоПропуск = Ложь;
//Сообщить(СоответствиеКлючаПоказателю.Получить(Показатель)+Подстрока);
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),СубПодстрока); //Подстрока
//Показатель = Показатель + 1;
//Подстрока.Добавить(СубПодстрока);
КонецЦикла;
КонецЕсли;
Иначе
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Подстрока); //Подстрока
Показатель = Показатель + 1;
Иначе
Если ЭтоПропуск Тогда
Продолжить;
Иначе
ЭтоПропуск = Истина;
Показатель = Показатель + 1;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(34) Manticor,
Для подстроки с номером вызвать опять РазложитьСтрокуВМассивПодстрок(ПодстрокаСНомером,"[")
Проанализировать сколько элементов массива получили, если один то его и берем, второй части нет, если более одного, то первый это Номер1 , второй это Номер2, в Номер2 делаем СтрЗаменить(Строка, "]", "") и все
PS а если в массиве 0, то нет номеров.
Для подстроки с номером вызвать опять РазложитьСтрокуВМассивПодстрок(ПодстрокаСНомером,"[")
Проанализировать сколько элементов массива получили, если один то его и берем, второй части нет, если более одного, то первый это Номер1 , второй это Номер2, в Номер2 делаем СтрЗаменить(Строка, "]", "") и все
PS а если в массиве 0, то нет номеров.
(36) SPID, вот сделал так, получается, если номер составной(тоесть номер1 и ном2 есть) а также CallerID1 и 2, то все заполняется в соответствии), Но если и номер и Caller простые, то все сдвигается. Что нужно переправить?
&НаСервере
Функция РазложитьСтроку2(Знач Стр, Разделитель = " ")
МассивСтрок = Новый Структура("F, CRN1CRN2, Orig, Dest, Дата,
|Время, Длит, Номер1, Номер2, CallerID1, CallerID2, Dir, DirEx");
//Стр = "- 000A000B 3 HOLD 16.10.2012 09:09:34 00:00:04 88412558752[] Внут 0 ";
Стр = "- 000B000D 7 INRT 16.10.2012 09:12:45 00:00:00 151 107 Внут 18 ";
//Стр = "+ 0002000A 2 NET 16.10.2012 09:53:22 00:01:17 84952230404[8884952230404] 102[230784] Внут 13 ";
МассивСтрок.Вставить("F",СокрЛП(Сред(Стр,1,2)));
МассивСтрок.Вставить("CRN1CRN2",СокрЛП(Сред(Стр,3,9)));
МассивСтрок.Вставить("Orig",СокрЛП(Сред(Стр,12,5)));
МассивСтрок.Вставить("Dest",СокрЛП(Сред(Стр,17,5)));
МассивСтрок.Вставить("Дата",СокрЛП(Сред(Стр,22,11)));
МассивСтрок.Вставить("Время",СокрЛП(Сред(Стр,33,9)));
МассивСтрок.Вставить("Длит",СокрЛП(Сред(Стр,42,9)));
// МассивСтрок.Вставить("Номер",СокрЛП(Сред(Стр,51,21)));
// Для остальной строки разбор по предыдущему методу
ДоразложитьСтроку(СокрЛП(Сред(Стр,50,СтрДлина(Стр)-50))," ",МассивСтрок); //49 //72
Для Каждого Элемент из МассивСтрок Цикл
Сообщить(Элемент.КЛюч + ":"+Элемент.Значение);
КонецЦикла;
КонецФункции
&НаСервере
Процедура ДоразложитьСтроку(Стр,Разделитель,МассивСтрок)
разд1 ="[";
разд2 ="]";
МассивПодстрок = РазложитьСтрокуВМассивПодстрок(Стр,Разделитель,Истина);
СоответствиеКлючаПоказателю = Новый Соответствие;
СоответствиеКлючаПоказателю.Вставить(1,"Номер1");
СоответствиеКлючаПоказателю.Вставить(2,"Номер2");
СоответствиеКлючаПоказателю.Вставить(3,"CallerID1");
СоответствиеКлючаПоказателю.Вставить(4,"CallerID2");
СоответствиеКлючаПоказателю.Вставить(5,"Dir");
СоответствиеКлючаПоказателю.Вставить(6,"DirEx");
ЭтоПропуск = Ложь;
Показатель = 1;
Для каждого Подстрока из МассивПодстрок Цикл
//84952230404[8884952230404] 102[230784] Внут 13
Если ЗначениеЗаполнено(Подстрока) Тогда
ЭтоПропуск = Ложь;
Врем = РазложитьСтрокуВМассивПодстрок(Подстрока,"[",истина);
Кол_воНомеров = Врем.Количество();
Если Кол_воНомеров = 1 Тогда
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]);
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1), Неопределено);
Показатель = Показатель + 2;
ИначеЕсли Кол_воНомеров = 2 Тогда
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]); //Подстрока
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1),СтрЗаменить(Врем[1], "]", ""));
Показатель = Показатель + 2;
Иначе
Если ЭтоПропуск Тогда
Продолжить;
Иначе
ЭтоПропуск = Истина;
Показатель = Показатель + 1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(37) Manticor, вот как то такое условие добавил по пказателю(дабы все жестко задано)
если номер пуст - то сдвигает все((, а так при заполненном номере работает.
то что неопределенное значение в структуру вставляю - потом на создании документа с таким значением как
может отразиться? Или тут как то по другому можно было?
Если Кол_воНомеров = 1 И Показатель<4 Тогда
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]);
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1), Неопределено);
Показатель = Показатель + 2;
ИначеЕсли Кол_воНомеров = 1 И Показатель>4 Тогда
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]);
Показатель = Показатель + 1;
ИначеЕсли Кол_воНомеров = 2 Тогда
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель),Врем[0]); //Подстрока
МассивСтрок.Вставить(СоответствиеКлючаПоказателю.Получить(Показатель+1),СтрЗаменить(Врем[1], "]", ""));
Показатель = Показатель + 2;
Иначе
Если ЭтоПропуск Тогда
Продолжить;
Показатьесли номер пуст - то сдвигает все((, а так при заполненном номере работает.
то что неопределенное значение в структуру вставляю - потом на создании документа с таким значением как
может отразиться? Или тут как то по другому можно было?
(38) Manticor,
Про Неопределенно нечего страшного, при присваивании в какой-либо типизированный атрибут документа неопределенно автоматически преобразуется в пустое значение указанного типа, с атрибутами составного типа тоже все нормально - там неопределенно так и будет.
По поводу алгоритма не совсем ясно, если CallerID будет отсутствовать в строке " 88412558752[] Внут 0", то получается неверно отработает алгоритм:
Итерация цикла 1 заполнит значения Номер1 = "88412558752"; Номер2 = "". Итерация цикла 2 заполнит CallerID1 = "Внут "; CallerID1 = неопределенно. Итерация цикла 3 заполнит Dir = "0"; DirEx = неопределено.
Протестируйте, может я где то ошибся.
Отсутствовать может только CallerID? Не самый хороший вариант, но.... так как CallerID числовой, а за ним идет текстовый показатель, то может попробовать преобразовать к числу... преобразовалось - это CallerID.
Про Неопределенно нечего страшного, при присваивании в какой-либо типизированный атрибут документа неопределенно автоматически преобразуется в пустое значение указанного типа, с атрибутами составного типа тоже все нормально - там неопределенно так и будет.
По поводу алгоритма не совсем ясно, если CallerID будет отсутствовать в строке " 88412558752[] Внут 0", то получается неверно отработает алгоритм:
Итерация цикла 1 заполнит значения Номер1 = "88412558752"; Номер2 = "". Итерация цикла 2 заполнит CallerID1 = "Внут "; CallerID1 = неопределенно. Итерация цикла 3 заполнит Dir = "0"; DirEx = неопределено.
Протестируйте, может я где то ошибся.
Отсутствовать может только CallerID? Не самый хороший вариант, но.... так как CallerID числовой, а за ним идет текстовый показатель, то может попробовать преобразовать к числу... преобразовалось - это CallerID.
Возможно подойдет: Ну и соответственно вставить проверку, если что-то вставлять не нужно
....
СоответствиеРеквизитов=обРазложитьСтрокуВСоответствие(ТекстСтроки, "пробел");
.....
Функция обРазложитьСтрокуВСоответствие(Знач Строка, Разделитель) Экспорт
Соответствие=Новый Соответствие;
ЧислоВхождений=СтрЧислоВхождений(Строка, Разделитель);
Для i=1 По ЧислоВхождений Цикл
ПервоеВхождение=Найти(Строка,Разделитель)-1;
Значение=Лев(Строка,ПервоеВхождение);
Строка=Прав(Строка,СтрДлина(Строка)-СтрДлина(Значение)-1);
Соответствие.Вставить(i,Значение);
КонецЦикла;
Соответствие.Вставить(i,Строка);
Возврат Соответствие;
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот