|
1С Преобразовать строку в массив | ☑ | ||
---|---|---|---|---|
0
Mr-FReSH
26.12.16
✎
15:46
|
Доброго времени суток!
С наступающим! Подскажите нубу, как можно преобразовать строку в массив, ориентируясь на символ переноса строки (Символы.ПС) Имею следующую строку: Lpu_id:555 (здесь стоит символ.пс) Org_Name:Негосударственное учреждение здравоохранения(здесь стоит символ.пс) Org_Nick:ДЕМО(здесь стоит символ.пс) Lpu_id:101(здесь стоит символ.пс) Org_Name:ЛПУ (здесь стоит символ.пс) Org_Nick:ТЕСТ(здесь стоит символ.пс) Нужен массив или структура или таблица значений по типу Lpu_id|Org_Name|Org_Nick| 555 Негос... ДЕМО 101 ЛПУ ТЕСТ Думаю вы поняли. Пока написал такую функцию &НаСервере Функция Преобразовать(Строка) НовСтрока = ""; Массив = Новый Массив; Для Сч = 1 По СтрДлина(Ответ) Цикл Символ = Сред(Ответ, Сч, 1); Если Символ <> Символы.ПС Тогда НовСтрока = НовСтрока + Символ; Иначе Ключ = Сред(НовСтрока,1,Найти(НовСтрока,":")-1); Значение = Сред(НовСтрока,Найти(НовСтрока,":")+1,СтрДлина(НовСтрока)-Найти(НовСтрока,":")); стСтрокаТаблицы = Новый Структура; стСтрокаТаблицы.Вставить(Ключ, Значение); Массив.Добавить(стСтрокаТаблицы); НовСтрока = ""; КонецЕсли; КонецЦикла; КонецФункции Но результат не много не такой как нужен http://i86.fastpic.ru/big/2016/1226/fe/830384ab6c47b4552b47a0a4037549fe.png Подскажите что можно сделать |
|||
1
saaken
26.12.16
✎
15:53
|
МассивПолей = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(Поле, ".");
// Разбивает строку на несколько строк по разделителю. Разделитель может иметь любую длину. // // Параметры: // Строка - Строка - текст с разделителями; // Разделитель - Строка - разделитель строк текста, минимум 1 символ; // ПропускатьПустыеСтроки - Булево - признак необходимости включения в результат пустых строк. // Если параметр не задан, то функция работает в режиме совместимости со своей предыдущей версией: // - для разделителя-пробела пустые строки не включаются в результат, для остальных разделителей пустые строки // включаются в результат. // - если параметр Строка не содержит значащих символов или не содержит ни одного символа (пустая строка), то в // случае разделителя-пробела результатом функции будет массив, содержащий одно значение "" (пустая строка), а // при других разделителях результатом функции будет пустой массив. // СокращатьНепечатаемыеСимволы - Булево - сокращать непечатаемые символы по краям каждой из найденных подстрок. // // Возвращаемое значение: // Массив - массив строк. // // Примеры: // РазложитьСтрокуВМассивПодстрок(",один,,два,", ",") - возвратит массив из 5 элементов, три из которых - пустые // строки; // РазложитьСтрокуВМассивПодстрок(",один,,два,", ",", Истина) - возвратит массив из двух элементов; // РазложитьСтрокуВМассивПодстрок(" один два ", " ") - возвратит массив из двух элементов; // РазложитьСтрокуВМассивПодстрок("") - возвратит пустой массив; // РазложитьСтрокуВМассивПодстрок("",,Ложь) - возвратит массив с одним элементом "" (пустой строкой); // РазложитьСтрокуВМассивПодстрок("", " ") - возвратит массив с одним элементом "" (пустой строкой); // // Примечание: // В случаях, когда разделителем является строка из одного символа, и не используется параметр СокращатьНепечатаемыеСимволы, // рекомендуется использовать функцию платформы СтрРазделить. Функция РазложитьСтрокуВМассивПодстрок(Знач Строка, Знач Разделитель = ",", Знач ПропускатьПустыеСтроки = Неопределено, СокращатьНепечатаемыеСимволы = Ложь) Экспорт Результат = Новый Массив; // Для обеспечения обратной совместимости. Если ПропускатьПустыеСтроки = Неопределено Тогда ПропускатьПустыеСтроки = ?(Разделитель = " ", Истина, Ложь); Если ПустаяСтрока(Строка) Тогда Если Разделитель = " " Тогда Результат.Добавить(""); КонецЕсли; Возврат Результат; КонецЕсли; КонецЕсли; // Позиция = СтрНайти(Строка, Разделитель); Пока Позиция > 0 Цикл Подстрока = Лев(Строка, Позиция - 1); Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Подстрока) Тогда Если СокращатьНепечатаемыеСимволы Тогда Результат.Добавить(СокрЛП(Подстрока)); Иначе Результат.Добавить(Подстрока); КонецЕсли; КонецЕсли; Строка = Сред(Строка, Позиция + СтрДлина(Разделитель)); Позиция = СтрНайти(Строка, Разделитель); КонецЦикла; Если Не ПропускатьПустыеСтроки Или Не ПустаяСтрока(Строка) Тогда Если СокращатьНепечатаемыеСимволы Тогда Результат.Добавить(СокрЛП(Строка)); Иначе Результат.Добавить(Строка); КонецЕсли; КонецЕсли; Возврат Результат; КонецФункции |
|||
2
Mr-FReSH
26.12.16
✎
15:55
|
(1) Результат не тот
|
|||
3
Mr-FReSH
26.12.16
✎
15:56
|
||||
4
Timon1405
26.12.16
✎
15:56
|
(0)
Для Сч = 1 по СтрЧислоСтрок(ИсходныйТекст) Цикл Сообщить(СтрПолучитьСтроку(ИсходныйТекст,Сч)); КонецЦикла; |
|||
5
Mr-FReSH
26.12.16
✎
15:59
|
(4) Смысл вроде ясен, но не понятно будет ли обработка универсальна
|
|||
6
mxs089
26.12.16
✎
15:59
|
СтрРазделить
|
|||
7
mxs089
26.12.16
✎
16:00
|
СтрРазделить(МояСтрока, Символы.ПС)
|
|||
8
Mr-FReSH
26.12.16
✎
16:01
|
(4) Дак черт, в итоге я опять получу то, с чего начал собственно...
|
|||
9
Garykom
гуру
26.12.16
✎
16:34
|
(0) Че пишем признавайся? ОНЛС или ОМС
|
|||
10
ELEA26
26.12.16
✎
16:47
|
СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов
Потом перегоняй в ТЗ |
|||
11
Serg_1960
26.12.16
✎
16:48
|
Строка = "Lpu_id:555" + Символы.ПС + "Org_Name:Негосударственное учреждение здравоохранения" + Символы.ПС + "Org_Nick:ДЕМО" + Символы.ПС
+ "Lpu_id:101" + Символы.ПС + "Org_Name:ЛПУ" + Символы.ПС + "Org_Nick:ТЕСТ" + Символы.ПС; МногоСтрок = СтрЗаменить(Строка, ":", Символы.ПС); ТабЗнач = Новый ТаблицаЗначений(); МассивТипов = Новый Массив; МассивТипов.Добавить(Тип("Строка")); ПараметрыСтроки = Новый КвалификаторыСтроки(100); ТипСтроки = Новый ОписаниеТипов(МассивТипов, , ПараметрыСтроки); Для х = 1 По СтрЧислоСтрок(МногоСтрок) Цикл ТекИмя = СтрПолучитьСтроку(МногоСтрок, х); Если ТабЗнач.Колонки.Найти(ТекИмя) = Неопределено Тогда ТабЗнач.Колонки.Добавить(ТекИмя, ТипСтроки); КонецЕсли; х = х + 1; КонецЦикла; Для х = 1 По СтрЧислоСтрок(МногоСтрок) Цикл ТекСтрока = ТабЗнач.Добавить(); ТекИмя = СтрПолучитьСтроку(МногоСтрок, х); ТекЗнач = СтрПолучитьСтроку(МногоСтрок, х+1); ТекСтрока[ТекИмя] = ТекЗнач; ТекИмя = СтрПолучитьСтроку(МногоСтрок, х+2); ТекЗнач = СтрПолучитьСтроку(МногоСтрок, х+3); ТекСтрока[ТекИмя] = ТекЗнач; ТекИмя = СтрПолучитьСтроку(МногоСтрок, х+4); ТекЗнач = СтрПолучитьСтроку(МногоСтрок, х+5); ТекСтрока[ТекИмя] = ТекЗнач; х = х + 5; КонецЦикла; ТабЗнач.ВыбратьСтроку(); |
|||
12
ELEA26
26.12.16
✎
16:53
|
(3) ясный пень не тот, потом каждую строку в структуру. В итоге у тебя будет массив структур свойства которой - эти имена до ":".
|
|||
13
Mr-FReSH
27.12.16
✎
07:23
|
(9) Принимаю участие в тестировании одного медицинского веб сервиса
|
|||
14
Mr-FReSH
27.12.16
✎
07:23
|
(12) и в итоге у меня получится то, что я прикладывал на скрине в шапке
|
|||
15
Это_mike
27.12.16
✎
07:23
|
(9) ЛТП
|
|||
16
Mr-FReSH
27.12.16
✎
07:32
|
(11) Огромное человеческое спасибо) Все именно так как и нужно)
|
|||
17
VladZ
27.12.16
✎
07:34
|
(0) Использовать массив, содержащий в себе структуру - это как " яйцо — в утке, утка — в зайце, заяц — в кованом ларце". Зачем так усложнять? Есть таблица значений, ее и используем.
|
|||
18
Мимохожий Однако
27.12.16
✎
07:35
|
Если набор полей до двоеточия в каждой строке одинаков для всего файла, то достаточно прочитать построчно и сформировать массив со структурой в каждом значении с ключами этих полей.
|
|||
19
Mr-FReSH
27.12.16
✎
07:41
|
Да все, ребят, Serg уже сделал так как и надо)
|
|||
20
VladZ
27.12.16
✎
07:54
|
Немного слов о функции РазложитьСтрокуВМассивПодстрок.
Функция безусловно полезная. Но нужно понимать, что функция разрабатывалась для каких-то универсальных алгоритмов. Обычно параметры "ПропускатьПустыеСтроки" и "СокращатьНепечатаемыеСимволы" не нужны. Если указанной функции в составе конфы нет, можно использовать МояСтрокаМногострочныйВариант = СтрЗаменить(МояСтрока,СимволРазделитель , Символы.ПС). Далее, чтобы получить нужную строку пишем СтрПолучитьСтроку(МояСтрокаМногострочныйВариант, НомерСтроки). Получается, что вышеозвученная функция просто не нужна. |
|||
21
VladZ
27.12.16
✎
07:56
|
+20 Вариант перебора строк:
Для Индекс=1 по СтрКоличествоСтрок(МояСтрока) Цикл |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |