|
Как по-простейшему разобрать строку с двоеточиями? Ø (Волшебник 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) я уже свой написал, без БСП, конечно же:
|
|||
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) Проблема даже не в том, что у тебя код неоптимальный
Проблема в том, что нихрена не сообразишь, что он делает, пока не выполнишь СтруктураСлова какая-то, в которой типа есть левое и правое слово, а на самом деле левая часть без последнего слова и правая часть, равная последнему слову Исключение для мать его _особого_ случая Непонятное название функции И все это, помноженное на говнокод, делает код нечитабельным от слова совсем хотя бы так что ли написал
|
|||
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С )))
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |