Имя: Пароль:
1C
 
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 по СтрКоличествоСтрок(МояСтрока) Цикл