Имя: Пароль:
1C
 
Как по-простейшему разобрать строку с двоеточиями?
Ø (Волшебник 13.12.2022 13:26)
0 Гений 1С
 
гуру
12.12.22
13:56
Там строчка такая (loren ipsum):

Aaaa: ловыа ва лывоа Bbb.bb: sdfkjfsd lksdf Cccc: kjlsdfl lsd

Т.е. ключевые поля - это слова без пробелов, но могут содержать точки, потом двоеточие.

Я думаю разбирать так - разбить по двоеточиям:
Aaaa
ловыа ва лывоа Bbb.bb
sdfkjfsd lksdf Cccc
kjlsdfl lsd

и далее последовательно выделять последнее слово.

Regexp не хочу насиловать.

Есть другие идеи? может кто писал?
17 Kassern
 
12.12.22
14:40
(13) Интересно, а что будет быстрее в плане получения последнего слова из строки? Разделить на 1000000 слов текст и получить последний элемент, или же найти с конца индекс последнего пробела и получить по нему последнее слово?)
18 hockeyist
 
12.12.22
14:42
Зачем все это? (10) (14)
м=стрразделить();
для каждого стр из м цикл
   н=стрразделить();
   сообщить(н[н.количество()-1]);
конеццикла;
19 NorthWind
 
12.12.22
14:42
(15) бигдата будет негодовать просто от попыток произвольно лазить по очень большой строке, при условии, что части этой строки могут быть в дисковой памяти, а части в оперативной.
20 magicSan
 
12.12.22
14:48
(19) я загружал массивы по 16 гигов ксв - не рассказывай мне как это делать ))))
(18) Я выдал Ключ-Значение, у тебя что за нах?
21 Kassern
 
12.12.22
14:50
(20) У него просто дважды строка в массив строк разделяется, вначале по ":" Потом по " " и берется последний элемент.
22 NorthWind
 
12.12.22
14:53
(20) ну и как 16-гиговая строка себя чувствовала, особенно на компе с 8Г оперативки?
23 PR
 
12.12.22
14:55
(0) Все же просто
Разбиваешь по пробелам
Дальше в цикле перебираешь элементы массива, если последний символ ":", то твой пациент
24 НафНаф
 
12.12.22
14:55
(5) хабростатья?
25 ass1c
 
12.12.22
14:55
(18) так же +
26 magicSan
 
12.12.22
14:56
(22) когда подключили пхп вполне себе.
27 PR
 
12.12.22
14:57
(13) Потому что можно проще и быстрее
28 Timon1405
 
12.12.22
15:20
(23) если сначала делить по пробелам, тогда последнее слово (lsd) придётся обыгрывать дополнительно и простота теряется
29 Гений 1С
 
гуру
12.12.22
15:21
(10) я уже свой написал, без БСП, конечно же:


Функция РазобратьСтрокуСПараметрамиИдентификаторами(Строка, Разделитель = ":") Экспорт
    
    СооПараметры = Новый Соответствие();
    Массив = СтрРазделить(Строка, Разделитель);
    Пока Массив.Количество() > 1 Цикл
        Ключ = Массив[0];          
        ТекСтрока = Массив[1];
        СтруктураСлова = ВыделитьСловоСКонцаСтроки(ТекСтрока);
        Если Массив.Количество() = 2 Тогда //Особый случай, последний
            Значение = ТекСтрока;            
        Иначе
            Значение = СтруктураСлова.Левое;
            Массив[1] = СтруктураСлова.Правое;
        КонецЕсли;
        СооПараметры.Вставить(Ключ, СокрЛП(Значение));
        Массив.Удалить(0);
    КонецЦикла;
    
    Возврат СооПараметры;
    
КонецФункции

Функция ВыделитьСловоСКонцаСтроки(Строка) Экспорт
    Р = Новый Структура("Левое, Правое", "", "");
    Длина = СтрДлина(Строка);
    Для Инд = 1 По Длина Цикл    
        Поз = Длина - Инд + 1;
        Симв = Сред(Строка, Поз, 1);
        Если Симв = " " Тогда
            Р.Левое = Лев(Строка, Поз - 1);
            Прервать;
        КонецЕсли;
        Р.Правое = Симв + Р.Правое;
    КонецЦикла;
    Возврат р;
КонецФункции

30 Гений 1С
 
гуру
12.12.22
15:21
(23) тоже вариант, в принципе.
31 Garykom
 
гуру
12.12.22
15:24
1. КА с обратным поиском (цикл с конца по начало строки) для замены " " перед ":" на другой символ
2. Далее банально
32 PR
 
12.12.22
15:31
(28) О, боже мой, да, перед началом обработки массива придется в последнем элементе добавить : в конец
33 PR
 
12.12.22
15:32
(29) Хочется блевануть
34 PR
 
12.12.22
15:44
Геня как всегда в (0) ничего внятно не объяснил, а потом написал код, из которого следует, что он хотел разбить строку на пары "Ключ + Значение", разделенные двоеточиями
Генитально, как всегда
35 PR
 
12.12.22
15:45
(34) Пардон, двоеточиеми имеется в виду не пары, а ключ и значение
36 Kassern
 
12.12.22
15:47
(34) Гениальный постановщик задачи)
37 PR
 
12.12.22
15:47
Посмотрел (0), еще раз чуть не блеванул от прекрасного примера, из которго нихрена непонятно, где там ключи, где там значения, а где просто Геня нассал между прочим
38 PR
 
12.12.22
15:52
(36) Индус белорусский, my ass
39 Гений 1С
 
гуру
12.12.22
16:23
(33) Извини, я не хотел вызывать у тебя блевонтин, лучше не читай мои ветки, раз у тебя на меня аллергия. ;-)
40 Гений 1С
 
гуру
12.12.22
16:24
(19) в выписках длина текста ограничена таки.
41 Said_We
 
12.12.22
16:52
(0) "Aaaa: ловыа ва лывоа Bbb.bb: sdfkjfsd lksdf Cccc: kjlsdfl lsd"

Результат какой должен получиться. Так и не понял что на выходе необходимо получить.
42 PR
 
12.12.22
16:52
(39) Проблема даже не в том, что у тебя код неоптимальный
Проблема в том, что нихрена не сообразишь, что он делает, пока не выполнишь
СтруктураСлова какая-то, в которой типа есть левое и правое слово, а на самом деле левая часть без последнего слова и правая часть, равная последнему слову
Исключение для мать его _особого_ случая
Непонятное название функции
И все это, помноженное на говнокод, делает код нечитабельным от слова совсем

хотя бы так что ли написал

Функция ПараметрыИдентификации(СтрокаПараметров)
    
    ПараметрыИдентификации = Новый Соответствие;
    
    Если ПустаяСтрока(СтрокаПараметров) Тогда
        Возврат ПараметрыИдентификации;
    КонецЕсли;
    
    МассивПодстрок = СтрРазделить(СтрокаПараметров, ":");
    
    Если МассивПодстрок.Количество() = 1 Тогда
        Возврат ПараметрыИдентификации;
    КонецЕсли;
    
    МассивПодстрок[МассивПодстрок.Количество() - 1] = МассивПодстрок[МассивПодстрок.Количество() - 1] + " ";
    
    Ключ = МассивПодстрок[0];
    
    Для ПорядковыйНомерПараметра = 1 По МассивПодстрок.Количество() - 1 Цикл
        ЗначениеПлюсКлюч = Сред(МассивПодстрок[ПорядковыйНомерПараметра], 2);
        ПозицияПоследнегоПробела = СтрНайти(ЗначениеПлюсКлюч, " ", НаправлениеПоиска.СКонца);
        Значение = Лев(ЗначениеПлюсКлюч, ПозицияПоследнегоПробела - 1);
        ПараметрыИдентификации.Вставить(Ключ, Значение);
        Ключ = Сред(ЗначениеПлюсКлюч, ПозицияПоследнегоПробела + 1);
    КонецЦикла;
    
    Возврат ПараметрыИдентификации;
    
КонецФункции
43 PR
 
12.12.22
16:53
(41) Геня выше корректных понятных примеров, сами догадаются

Aaaa: ловыа ва лывоа
Bbb.bb: sdfkjfsd lksdf
Cccc: kjlsdfl lsd
44 PR
 
12.12.22
16:55
+(43) Вот что мешало вместо собачьего "Aaaa: ловыа ва лывоа Bbb.bb: sdfkjfsd lksdf Cccc: kjlsdfl lsd" написать "Плательщик: Иванов Иван Иванович Месяц.Год: 12.2022 Сумма: 200"?
45 Гений 1С
 
гуру
12.12.22
16:58
(42) а мне твой код кажется сложным. Вот уж действительно, кто как привык, тот так и пишет.
46 Гений 1С
 
гуру
12.12.22
16:58
(44) ну там на турецком (хз что там конфиденциально, что нет), а так то да, можно было, виноват.
47 Гений 1С
 
гуру
12.12.22
16:59
(42) а, я понял что мне не нравится в твоем коде. Ты не разбиваешь его на под-процедуры. Даже у меня подпроцедура одна завалялась. Ну и потом я использую рекурсию в виде удаления из массива, это сокращает код
48 lodger
 
12.12.22
17:01
(44) уровень гениальности же.
49 Said_We
 
12.12.22
17:03
(46) Тогда на чистом SQL и на 1C SQL не буду предлагать.
50 PR
 
12.12.22
17:04
(45) LOL
Твой код вообще выполнить нужно, чтобы понять, что в итоге будет
51 PR
 
12.12.22
17:05
(47) А что мне разбивать-то, там разбивать нечего, проще в паре мест комментарии добавить, зачем это нужно
52 PR
 
12.12.22
17:07
(47) Рекурсию ты не используешь, двоечник
А удаление ты зря сделал, меняешь данные, потому что тебе лень вычислить указатель
За такое канделябром бьют, бывает
53 Гений 1С
 
гуру
12.12.22
17:10
(51) разделяй и властвуй ибо, старо как мир.
(52) вот эта мелочность идет от перфекционизма. Понятно же, что простота восприятия кода в данном случае важнее, чем эффективность, которую потребитель даже не заметит. Я меняю не данные, а временные данные, почуй разницу. Это ты еще Лиспа не нюхал, там такая деструкция - норма жизни
54 Гений 1С
 
гуру
12.12.22
17:10
(51) но ты их не добавил
55 PR
 
12.12.22
17:11
(53) Разделяют тогда, когда есть что разделять
Если разделять нечего, то разделение усложняет, а не упрощает понимание
56 Said_We
 
12.12.22
17:12
А зачем сначала делите на слова с разделителем ":"?
Проще сначала поделить слова по пробелам. Потом перед каждым словом, в котором есть ":" перенос строки выводить и усё.
57 PR
 
12.12.22
17:12
(53) Геня, в твоем варианте до перфекционизма вечность, о чем ты
Просто хотя бы хоть насколько-то читабельным код сделать и то великое дело
58 PR
 
12.12.22
17:13
(54) Ну так и ты не заплатил за него
59 Kassern
 
12.12.22
17:14
(56) Потому что ТС написал одно в (0), а получить в итоге хочет другое (связку Ключ+Значение, где до двоеточия ключ, после - значение)
60 PR
 
12.12.22
17:14
(56) Нет
Тогда придется значения соединять через пробел до тех пор, пока не встретился ключ (в конце ":") или не конец массива
61 PR
 
12.12.22
17:16
+(60) А так каждая пара "Ключ + Значение" хранится так:
Ключ — последнее слово в строке
Значение — все, без последнего слова, в следующей строке
Последнюю строку не берем, там только значение
62 polosov
 
12.12.22
17:25
Гений деградирует. Куда катится мир...
63 Said_We
 
12.12.22
17:29
(60) А если примерно так:

ИсходнаяСтрока = "ыва: фыдофвдыаоф двао дфвлоадфоп вдлаоа: ывдопв аджоф фовыа фдова влаовло: ыдваоыдлвао дыоады вопы дао";
Подстрока = "";

МассивСтрок = СтрРазделить(ИсходнаяСтрока, " "); // тут пробел
Для Каждого Стр Из ИсходнаяСтрока Цикл

    Если Найти(Стр, ":") Тогда
        Сообщить(Подстрока);
        Подстрока = "";
    КонецЕсли;

    Подстрока = Подстрока +" "+ Стр; // тут тоже пробел

КонецЦикла;

Сообщить(Подстрока);
64 PR
 
12.12.22
17:32
(63) Эээ... что это?
Ты хоть проверяй что ли, перед тем как пишешь
65 Said_We
 
12.12.22
17:33
(63) Но на SQL мне нравится больше. Наверняка же на входе не одна строка, а некое поле у таблицы в том виде как в (0). И данную операцию необходимо проводить не над одной строкой, а над всеми.

(64) На коленке писал. Может где и ошибся :-)
66 Serginio1
 
12.12.22
17:34
67 Said_We
 
12.12.22
17:34
(64) На выходе должно быть примерно вот это:

ыва: фыдофвдыаоф двао дфвлоадфоп
вдлаоа: ывдопв аджоф фовыа фдова
влаовло: ыдваоыдлвао дыоады вопы дао
68 Said_We
 
12.12.22
17:39
(63)
"Для Каждого Стр Из ИсходнаяСтрока Цикл"
заменить на
"Для Каждого Стр Из МассивСтрок Цикл"
69 lodger
 
12.12.22
17:40
(0) ну вот ровно то что Гений попросил в исходном посте:

инпут = "Aaaa: ловыа ва лывоа Bbb.bb: sdfkjfsd lksdf Cccc: kjlsdfl lsd";
аутпут = новый массив;
МассивПодстрок = СтрРазделить(инпут,":");
Для Итератор = 0 по МассивПодстрок.Количество()-2 Цикл
    ПромежуточныйМассив = СтрРазделить(МассивПодстрок.Получить(Итератор)," ");
    аутпут.Добавить(ПромежуточныйМассив.Получить(ПромежуточныйМассив.ВГраница()));
КонецЦикла
70 Kassern
 
12.12.22
17:41
(69) "МассивПодстрок.Количество()-2" - вот будет весело, если в массиве будет меньше 2 элементов)
71 Said_We
 
12.12.22
17:44
Так чем вариант в (63) не подходит?
72 PR
 
12.12.22
17:45
(69) Ага, только просил он в итоге по факту не это
Просто у него русский не родной
73 PR
 
12.12.22
17:46
(71) Тем, что там вообще нет функции, возвращающей нужное соответствие
74 Said_We
 
12.12.22
17:47
(63) "Если Найти(Стр, ":") Тогда"
заменить на:
"Если Найти(Стр, ":") > 0 Тогда"

Может ещё где навоял... Но важен алгоритм.
75 lodger
 
12.12.22
17:47
(70) даже если там только "Aaaa: ловыа ва лывоа", то все словится. меньше может быть только если нарушен формат ввода.
76 PR
 
12.12.22
17:49
(74) >>Но важен алгоритм
Которого нет
77 Said_We
 
12.12.22
17:49
(73) (76) В задаче в (0) на входе строка и на выходе либо строка разбитая на строки, либо несколько строк. Не описал тип возвращаемого значения автор. Поэтому я над этим даже не заворачивался.
78 Kassern
 
12.12.22
17:50
(75) "если нарушен формат ввода." - обычное дело, если речь идет о строке, где ввод возможен в свободной форме.
79 PR
 
12.12.22
17:50
(77) Ну да, ты как Геня, тот тоже не заморачивался, набросал говна какого-то и сойдет
Но у него хотя бы работает, это плюс
80 Said_We
 
12.12.22
17:53
(79) А чуть поправить не бывает? :-)

ИсходнаяСтрока = "ыва: фыдофвдыаоф двао дфвлоадфоп вдлаоа: ывдопв аджоф фовыа фдова влаовло: ыдваоыдлвао дыоады вопы дао";
Подстрока = "";

МассивСтрок = СтрРазделить(ИсходнаяСтрока, " ");// тут пробел

Для Каждого Стр Из МассивСтрок Цикл

    Если Найти(Стр, ":") > 0 Тогда
        Сообщить(Подстрока);
        Подстрока = "";
    КонецЕсли;

    Подстрока = Подстрока +" "+ Стр;// тут тоже пробел

КонецЦикла;

Сообщить(Подстрока);
81 PR
 
12.12.22
17:55
(80) Слушай, за вами всеми чуть править что-то нет никакого желания
Капец, если честно
82 Said_We
 
12.12.22
17:57
(81) У тебя же синтаксис помощник есть...
А у меня под рукой ничего нет.

"Подстрока = Подстрока +" "+ Стр" тут точку с запятой добавить для порядку. Хотя ошибки не должно давать - последняя команда в блоке.
83 Kassern
 
12.12.22
17:58
(80) Вы так и не поняли гениальную задумку ТС. Он на выходе хочет получить следующее
Структура=Новый Структура();
Структура.Вставить("Покупатель","Вася");
Структура.Вставить("Сумма","100");
Структура.Вставить("Валюта","рубль");
Вот такую структуру из строки:
ИсходнаяСтрока="Покупатель:Вася Сумма:100 Валюта:Рубль"
84 Said_We
 
12.12.22
17:59
ИсходнаяСтрока = "ыва: фыдофвдыаоф двао дфвлоадфоп вдлаоа: ывдопв аджоф фовыа фдова влаовло: ыдваоыдлвао дыоады вопы дао";
Подстрока = "";

МассивСтрок = СтрРазделить(ИсходнаяСтрока, " "); // тут пробел
Для Каждого Стр Из МассивСтрок Цикл
    Если Найти(Стр, ":") > 0 Тогда
        Сообщить(Подстрока);
        Подстрока = "";
    КонецЕсли;
    Подстрока = Подстрока +" "+ Стр; // тут тоже пробел
КонецЦикла;

Сообщить(Подстрока);
85 Kassern
 
12.12.22
18:00
(83) точнее не структура, а соответствие судя по ключам
86 Said_We
 
12.12.22
18:01
(83) Ну так вместо СООБЩИТЬ() вставляй заполнение своей структуры:

НекаяСтруктура.Добавить(СтрПрошлая, Подстрока);

Ещё одну переменную добавить и усё.
87 Said_We
 
12.12.22
18:06
Автор почему-то зациклился, что ":" это некий разделитель чего-то. На самом деле это признак начала блока. Разделитель тут как был пробел, так и остался. Просто слова с ":" являются началом очередного блока и не более того.

Повторю вопрос: "А зачем сначала делите на слова с разделителем ":"? "
88 lodger
 
12.12.22
18:06
(72) да я тоже понял, и пока вы тут умничали накидал стейдж2

инпут = "Aaaa: ловыа ва лывоа Bbb.bb: sdfkjfsd lksdf Cccc: kjlsdfl lsd";
МассивСлов = новый массив;
МассивПодстрок = СтрРазделить(инпут,":");
Для Итератор = 0 по МассивПодстрок.Количество()-2 Цикл
    ПромежуточныйМассив = СтрРазделить(МассивПодстрок.Получить(Итератор)," ");
    МассивСлов.Добавить(ПромежуточныйМассив.Получить(ПромежуточныйМассив.ВГраница()));
КонецЦикла;

аутпут  = новый Соответствие; ПрошлоеСлово = "";
Для Каждого ПодСтрока из МассивСлов Цикл
    НовоеЗначение = Сред(инпут,СтрДлина(ПодСтрока)+1+СтрНайти(инпут,ПодСтрока));
    Если ЗначениеЗаполнено(ПрошлоеСлово) Тогда
        аутпут.Вставить(ПрошлоеСлово,СтрЗаменить(аутпут.Получить(ПрошлоеСлово),ПодСтрока+":"+НовоеЗначение,""));
    КонецЕсли;    
    ПрошлоеСлово = ПодСтрока;
    аутпут.Вставить(ПодСтрока,СокрЛП(НовоеЗначение));
КонецЦикла;
89 Said_We
 
12.12.22
18:12
(88) Повторю вопрос: "А зачем сначала делите на слова с разделителем ":"? "
Не пойму - какой в этом смысл?
90 Гений 1С
 
гуру
12.12.22
18:13
(87) ну как бы да, но ладно.
91 Гений 1С
 
гуру
12.12.22
18:14
(79) потому что мне нужно чтобы работала. Выписка или грузится или не грузится, это вам не Выписка Шредигера
92 Said_We
 
12.12.22
18:19
(90) Прототип алгоритма в (84) пойдет?
93 PR
 
12.12.22
18:55
(91) Шрёдингера, блять
94 lodger
 
12.12.22
19:01
(91) (93) это просто квинтэссенция Гения1с.
95 Гений 1С
 
гуру
12.12.22
19:07
(93) буквоедство detected
96 PR
 
12.12.22
19:10
(95) Да не, не, я не против
Чем больше ты неграмотный говнокодер, тем больше востребован я
97 lodger
 
12.12.22
19:20
(95) попробовал мой велосипед?
98 kittystark
 
12.12.22
19:25
(0) А чем регэксп не пришелся? На всидку без проверки
.*\s(\S+)\:(.+)
Даст в $1 твой "параметр",$2 значение
99 lodger
 
12.12.22
19:27
(98) чепуха получается https://regex101.com/r/zvO4ED/1
100 Гений 1С
 
гуру
12.12.22
19:35
(98) 1с не поддерживает регэексп, нужны ВК и т.п. Нафиг
101 lodger
 
12.12.22
19:37
(100) игнорируешь?
102 Гений 1С
 
гуру
12.12.22
19:57
(101) я уже задачу решил и переписывать не буду. работает и ладно.
103 Said_We
 
12.12.22
20:19
(102) А чего тогда спрашивал?
104 Гений 1С
 
гуру
12.12.22
20:44
(103) думал кто быстро подскажет идею.
105 Said_We
 
12.12.22
22:34
(104) А если не быстро подсказали, но по сути, то своё не переделываешь? :-)
А какой тогда смысл подсказывать, если всё сделаешь и всё равно будешь как-то по своему делать?

Проще подождать денёк. Ты напишешь - ну всё я по своему всё сделал. И так каждая ветка. Твой вопрос и твой единственный ответ. :-)
106 ass1c
 
12.12.22
22:43
(105) На мой взгляд основная идея не получить верный ответ, а создать хайповую обсуждаемую топ тему, быть на слуху, получать как негативные комментарии, так и положительные. Ставить себя в центр обсуждений и т.д. Уверен что человеку с таким жизненным опытом вряд ли есть необходимость спрашивать какие либо бытовые вопросы по дому или решение простых не сложных алгоритмов на форме Мисты. А вот быть в центре внимания... С другой стороны в этом ничего плохого нет...
107 Said_We
 
12.12.22
23:13
(106) И я к такому же выводу прихожу. Единственное есть темы когда автор голову реально ломает, а ему помогать не хотят, а по привычке занимаются его хайпом. Вот тут засада-то и притаилась. :-)
108 Гений 1С
 
гуру
13.12.22
07:56
(106) ну я думал, что не срочно нужно решение, оставил темку, вдруг кто чего посоветует, но пришлось писать срочно самому. как-то так.
109 НафНаф
 
13.12.22
08:02
(108) самое сложное - не врать самому себе
110 Гений 1С
 
гуру
13.12.22
08:18
(109) в этом хорошо помогает медитация. рекомендую
111 PR
 
13.12.22
09:31
В общем, Геня опять создал Пашаветку
112 Kassern
 
13.12.22
09:31
(111) А у него бывают другие?
113 PR
 
13.12.22
09:39
(112) Да зря его из бана выпустили, Миста ничего не приобрела, нам и одного Паши хватало
Которого, кстати, тоже зря из бана выпустили
Примерно как прыщи, которые вылезают периодически, вроде как не смертельно, но некрасиво
114 lodger
 
13.12.22
11:54
хрен с ним, давайте осуждать (88)
или давайте починим (99)
115 lodger
 
13.12.22
11:55
каким образом мы можем валидировать ввод, чтобы (88) не загромождать тучей защит от кривых данных?
116 lolek
 
13.12.22
13:20
Тупой 1С )))