|
Можно ли отрезать от строки все после определенного символа без цикла? | ☑ | ||
---|---|---|---|---|
0
DJ Anthon
13.02.14
✎
17:15
|
А таких символов может быть несколько )
|
|||
1
Wobland
13.02.14
✎
17:15
|
возражений не имею
|
|||
2
shamannk
13.02.14
✎
17:16
|
Даже нужно!
|
|||
3
Ёпрст
13.02.14
✎
17:16
|
Сред
|
|||
4
DJ Anthon
13.02.14
✎
17:18
|
(3) а как найти-то его?
|
|||
5
DJ Anthon
13.02.14
✎
17:18
|
(1) спасибо!
я вроде накатал код при условии, что в строке нет переносов строки |
|||
6
DJ Anthon
13.02.14
✎
17:19
|
даже в одну строчку уместился
|
|||
7
KishMish
13.02.14
✎
17:19
|
Прав(Стр, КолвоСимволов)
|
|||
8
Серый Пес
13.02.14
✎
17:20
|
(4) Сыграю в КО: функция Найти() %)
|
|||
9
DJ Anthon
13.02.14
✎
17:20
|
просто интересно, как это можно сделать по-кошерному
(7) чему КолвоСимволов равно? |
|||
10
DJ Anthon
13.02.14
✎
17:21
|
(8) найти первый находит, а мне последний надо
|
|||
11
Ненавижу 1С
гуру
13.02.14
✎
17:21
|
Надо отрезать все после буквы А в слове КАРАНДАШ, что должно остаться?
КАРАНДА КАРА КА |
|||
12
Серый Пес
13.02.14
✎
17:22
|
(10) Тогда если без цикла - то рекурсией можно.
|
|||
13
DJ Anthon
13.02.14
✎
17:22
|
КАРАНДА
|
|||
14
DJ Anthon
13.02.14
✎
17:23
|
(12) без рекурсии, без циклов, без доппеременных
|
|||
15
Ненавижу 1С
гуру
13.02.14
✎
17:23
|
(10) без цикла нельзя, мы не знаем число повторений
|
|||
16
Ненавижу 1С
гуру
13.02.14
✎
17:24
|
(14) почему так жестко?
|
|||
17
Серый Пес
13.02.14
✎
17:24
|
(14) Тогда нельзя. Проблема не в отрезать - проблема в найти последний символ. Его без цикла\рекурсии не найти.
|
|||
18
DJ Anthon
13.02.14
✎
17:24
|
(15) знаем
|
|||
19
DJ Anthon
13.02.14
✎
17:24
|
(17) я нашел
|
|||
20
DJ Anthon
13.02.14
✎
17:25
|
П = Лев(П, Найти(П + "" "", СтрПолучитьСтроку(СтрЗаменить(П, "\", "" ""), СтрЧислоВхождений(П, "\") + 1) + "" "") - 2)
|
|||
21
Ненавижу 1С
гуру
13.02.14
✎
17:25
|
(18) знаем число повторений?
ну тогда тупо копипастим код заданное число раз (немного думая) |
|||
22
DJ Anthon
13.02.14
✎
17:26
|
*при условии, что в строке нет переносов строки
здесь определенный символ "\" |
|||
23
DJ Anthon
13.02.14
✎
17:26
|
(21) как без цикла это сделать?
|
|||
24
Aprobator
13.02.14
✎
17:29
|
ну можно конечно поизвращаться. Да и технически не особо сложно. Вот только - зачем?
|
|||
25
DJ Anthon
13.02.14
✎
17:31
|
(24) я извращенец
|
|||
26
Aprobator
13.02.14
✎
17:32
|
(25) ну тогда лови алгоритм.
|
|||
27
Aprobator
13.02.14
✎
17:33
|
(25) заменяешь в строке свой символ символом перевода строки.
Затем Пишешь все это в текстовый документ. Удаляешь последнюю строку. Получаешь текст из документа обратно, заменяешь перевод строки своим символом. |
|||
28
Aprobator
13.02.14
✎
17:34
|
+(27) пишется через метод УстановитьТекст
|
|||
29
DJ Anthon
13.02.14
✎
17:36
|
(27) у меня проще в (20)
|
|||
30
Aprobator
13.02.14
✎
17:41
|
(20) твой метод сработает при условии, что хвостик нигде в тексте больше не повторяется. Мой метод надежнее.
|
|||
31
Aprobator
13.02.14
✎
17:42
|
(30) к (29). Хотя идея сама по себе интересная.
|
|||
32
DJ Anthon
13.02.14
✎
17:44
|
(30) у меня при выборе каталога происходит открытие написанного в поле ввода каталога, и если она уже не существует, чтоб хоть открылась ближайшая доступная, как в тотал коммандере
Процедура ПутьНачалоВыбора(Элемент, СтандартнаяОбработка) ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога); ДиалогВыбораФайла.Заголовок = "Выберите каталог с файлами Excel"; П = Путь; Пока СтрДлина(П) > 0 Цикл Каталог = Новый Файл(П); Если Каталог.Существует() Тогда ДиалогВыбораФайла.Каталог = П; Прервать; Иначе П = Лев(П, Найти(П + "*", СтрПолучитьСтроку(СтрЗаменить(П, "\", "" ""), СтрЧислоВхождений(П, "\") + 1) + "*") - 2); КонецЕсли; КонецЦикла; ДиалогВыбораФайла.ПроверятьСуществованиеФайла = Истина; Если Не ДиалогВыбораФайла.Выбрать() Тогда Возврат; КонецЕсли; Элемент.Значение = ДиалогВыбораФайла.Каталог; КонецПроцедуры |
|||
33
DJ Anthon
13.02.14
✎
17:45
|
мелочь, а все равно удобнее, чем каждый раз сбиваться на Мои документы или хуже того во внутренние темпы 1Ски
|
|||
34
DJ Anthon
13.02.14
✎
17:46
|
(30) и хвостик нигде не повторится, ибо он с переносом строки
|
|||
35
Aprobator
13.02.14
✎
17:48
|
(33) каждый раз? Это с какой скоростью у вас структура каталогов то меняется? ИМХО, я бы эти м и заморачиваться не стал, даже для общего развития, лучше вон лишний раз доки перечитать.. Есть гораздо более интересные задачи.
|
|||
36
DJ Anthon
13.02.14
✎
17:50
|
(35) 150 учреждений, каталог с файлами после обработки убивается. а путь сетевой, искать его каждый раз заново трудно, ибо сеть без домена, а админ бабушка. 150 раз искать его руки времени час уйдет
|
|||
37
DJ Anthon
13.02.14
✎
17:51
|
слово "руки " - лишнее
|
|||
38
Йохохо
13.02.14
✎
17:52
|
(32) а не будет адского тупняка, если папка сетевая? а так фича мега полезная
|
|||
39
Aprobator
13.02.14
✎
17:53
|
(36)зачем убивать каталог? Можно тупо чистить содержимое.
|
|||
40
DS
13.02.14
✎
17:55
|
(32) полезная штука.
|
|||
41
Torquader
13.02.14
✎
17:57
|
Что касается каталога, то здесь явно без цикла не обойтись.
Напишу код на VbScript, чтобы все ещё раз ощутили ущербность 1С: FileString ' здесь мы получаем строку с именем файла Set Fso=CreateObject("Scripting.FileSystemObject") i=InStrRev(FileString,"/",-1,vbBinaryCompare) If i=0 Then ' оказалось, что нету у нас разделителя MsgBox "Дано только имя файла без пути - и где же нам его найти ?",0,"Фигня, однако" Else FilePath=Left(FileString,i-1) If Fso.FolderExists(FilePath)=True Then MsgBox "Файл находится в директории:" & FilePath,0,"Результат" Else Do i=InStrRev(FilePath,"/",-1,vbBinaryCompare) If i=0 Then MsgBox "Для файла указан путь, который вообще не существует - может быть - это сеть ?",0,"Нет пути" Exit Do End If FilePath=Left(FilePath,i-1) If Fso.FolderExists(FilePath)=True Then MsgBox "Существует только часть каталога:" & FilePath,0,"Криво введён путь" Exit Do End If Loop End If End If |
|||
42
DJ Anthon
14.02.14
✎
12:48
|
(38) проверил, вложенность 10 каталогов - секунда. наличие папки проверяется довольно-таки быстро, папка \\tsclient\C\Users\ проверялась немного дольше, около 5 секунд. но так и должно быть, ибо инет модемный.
(39) чтобы видеть, что еще не загрузили тем, кто не загружает, а ждет, пока его не загрузят ))) (41) на асме круче выглядеть будет |
|||
43
batmansoft
14.02.14
✎
12:55
|
(0) А почему именно без цикла?
Но если хочешь поизвращаться, кури регулярные выражения http://novichok1c.ru/ispolzovanie-regulyarnyh-vyrazheniy-v-1s |
|||
44
Вах 1-й
14.02.14
✎
13:00
|
помню в молодости тоже изгалялся, вывод любой семерочной таблицы в ексел с заголовками полей
4 строчки молучилось, меньше не помню, толи мозгов не хватило, то ли времени... ЗЫ помню только что надоело - и так сойдет |
|||
45
hhhh
14.02.14
✎
13:05
|
(42) ваше (20) это нереально долго будет, циклов в ней по факту в 20 раз больше, чем в обычном простом переборе.
|
|||
46
DJ Anthon
14.02.14
✎
16:53
|
(45) не спорю, зато в строчку уместилось. конечно же, для таймкритикал-кода надо будет писать попроще. а на один раз это незаметно.
(43) давно хочу поизучать, но все руки не доходят, ибо не треба |
|||
47
m-serg74
14.02.14
✎
17:18
|
(46) не в одну, но без цикла
Стр1 = СтрЗаменить(ПолеВвода1, ПолеВвода2, Символы.ПС); Стр2 = СтрПолучитьСтроку(Стр1, СтрЧислоСтрок(Стр1)); Сообщить(Стр2); |
|||
48
m-serg74
14.02.14
✎
17:21
|
(17) с фига ли?
см. (47) |
|||
49
m-serg74
14.02.14
✎
17:26
|
(48) извиняюсь (17), без доп. переменных не досмотрел
тогда только Отрезка = СтрПолучитьСтроку(СтрЗаменить(П, "\", Символы.ПС), СтрЧислоСтрок(СтрЗаменить(П, "\", Символы.ПС))); но это уже изврат какойто |
|||
50
m-serg74
14.02.14
✎
17:30
|
(48) (49) сторно :))) облажался ваще... отрезать все после, а я оставил все что после, фу на меня:)
|
|||
51
Torquader
14.02.14
✎
21:27
|
(50) Некоторые программисты начинают кодить ещё до того, как заказчик прекратит произносить описание технического задания, но, к сожалению, не все из них - телепаты, поэтому, в результате получается совсем не то, что хотели.
|
|||
52
Serg_1960
14.02.14
✎
22:16
|
(50) Не расстраивайся. Зато ты теперь знаешь что и сколько надо отрезать :)
|
|||
53
awa15
14.02.14
✎
22:44
|
(32) Вместо
П = Лев(П, Найти(П + "*", СтрПолучитьСтроку(СтрЗаменить(П, "\", "" ""), СтрЧислоВхождений(П, "\") + 1) + "*") - 2); Напиши просто П = Каталог.Путь; |
|||
54
Фокусник
14.02.14
✎
23:50
|
(0) а потом потраченные на эту фигню часы в счёт включишь? ;)
|
|||
55
DJ Anthon
15.02.14
✎
21:41
|
(53) для себя ж делаю. чем еще заняться, пока отладка идет?
(54) у меня безлимит, заказчик платит за конечный результат фиксированную озвученную вначале сумму. а на это я потратил пару минут. просто думал, есть решение получше. в нормальных прогах же это есть. |
|||
56
ivanovnm
15.02.14
✎
23:37
|
(0) Не используя цикла можно отрезать все после определенного первого вхождения символа в строку или после последнего.
|
|||
57
ivanovnm
15.02.14
✎
23:39
|
(20) А зачем ты что-то там в строке менял? Строку попортил. Лишние движения.
|
|||
58
hhhh
16.02.14
✎
00:23
|
(55) что-то вы не то курите. Вот же
Файл = Новый Файл(П); П = Файл.Путь; заметь, без всяких циклов. |
|||
59
Torquader
16.02.14
✎
00:27
|
(58) Он хочет найти самую последнюю существующую папку, а путь вернёт всё до последнего слэша.
|
|||
60
hhhh
16.02.14
✎
00:36
|
(59) а это ведь одно и то же, то что в (0) спрашивается
|
|||
61
Torquader
16.02.14
✎
00:39
|
(60) Не факт.
Например, C:\TEMP\ВсякаяКуча\МаленькиеФайлы\ФайлСЧемТоТам.txt должен вернуть C:\TEMP, если в директории TEMP нет папки ВсякаяКуча. |
|||
62
hhhh
16.02.14
✎
00:47
|
(61) ну можно (58) в цикле запустить, буде на 4 строчки больше
|
|||
63
DJ Anthon
16.02.14
✎
12:53
|
(62) это типа, сами топите урановые ломы в ртути? Е)
|
|||
64
Torquader
16.02.14
✎
15:57
|
(63) Просто, если какой-то папки в пути нет, то файл гарантированно не создастся, как бы мы там этот путь не резали. Конечно, можно посоздавать папки.
Например, команда Mkdir прекрасно умеет создавать вложенные папки. То есть для неё (58) вполне достаточно - получил путь до файла, если его нет, то попробовал создать - если создать не получилось, то кто-то в пути написал то, что там использовать нельзя. P.S. Урановые во ртути, говорите, что же у вас за планета такая, что другое не тонет ? |
|||
65
sda553
16.02.14
✎
16:02
|
Храните строки в виде суффиксного дерева
|
|||
66
Torquader
16.02.14
✎
16:22
|
(65) Вообще-то, если делать всё правильно, то проблемы выбора строки - это проблема программистов, реализующих диалог выбора файла.
В строке выбора файла от 1С-ника нужно только по кнопке выбора открыть этот диалог. |
|||
67
DJ Anthon
16.02.14
✎
16:23
|
(64) ну еще чего, создавать... я не выгружаю, а загружаю, просто путь к папке далекий, каждый раз его не охота открывать, тем боле по сети. а при выгрузке создавать путь - это правильно.
(65) какого дерева? |
|||
68
Aprobator
19.02.14
✎
13:44
|
(42) да пофиг. Эта папка все равно ложиться постоянно в какую то подпапку - храни путь на нее и все.
|
|||
69
YXMbIJI
19.02.14
✎
14:13
|
Во выстрадал ))
Стр = "C:\TEMP\ВсякаяКуча\МаленькиеФайлы\ФайлСЧемТоТам.txt"; Сообщить(Лев(Стр, СтрДлина(Стр) - СтрДлина(СтрПолучитьСтроку(СтрЗаменить(Стр, "\", Символы.ПС), СтрЧислоВхождений(Стр, "\") + 1)))); |
|||
70
DJ Anthon
19.02.14
✎
22:35
|
(69) твой код короче на два символа и немного безопаснее (нет символа "*"), ты круче ;)
тем, кто спрашивает, нафига - вот его еще одно применение Процедура НачалоПериодаПриИзменении(Элемент) Попытка ПолноеИмяФайла = Лев(ПолноеИмяФайла, СтрДлина(ПолноеИмяФайла) - СтрДлина(СтрПолучитьСтроку(СтрЗаменить(ПолноеИмяФайла, "\", "" ""), СтрЧислоВхождений(ПолноеИмяФайла, "\") + 1))) + СтрЗаменить(ПредставлениеПериода(НачалоДня(НачалоПериода), КонецДня(КонецПериода), "ФП = Истина"), " г.", "") + ".xml"; Исключение КонецПопытки КонецПроцедуры автосмена имени файла выгрузки при смене периода, например |
|||
71
ЧашкаЧая
19.02.14
✎
23:15
|
Чего только не придумают чтобы не учить регэкспы.
|
|||
72
Torquader
20.02.14
✎
11:58
|
(71) Ну, если бы всё было так просто - иногда - решение через RegExp тоже не поражает прозрачностью - а перебор в цикле решает любые задачи, конечно, если строка не бесконечная.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |