Имя: Пароль:
1C
1С v8
Замена заглавных букв на прописные, если заглавных букв больше 5 подряд
,
0 BalBess
 
28.10.13
06:43
Есть такая задача, если в наименовании товара больше 5 заглавных букв подряд, то заменить на прописные, кроме первой. например:
Ноутбук SAMSUNG 300V5A, заменяем на: Ноутбук Samsung 300V5A
Русских букв это тоже касается, цифры не в счет
1 Wobland
 
28.10.13
06:47
задачу понял. дальше
2 Godofsin
 
28.10.13
06:49
5оо руб.
3 BalBess
 
28.10.13
06:51
дальше, как лучше сделать? ))
может через регулярки? кто поможет составить шаблон
4 BalBess
 
28.10.13
06:53
[2] пока не рассматриваю, задача не срочная, попробую сам с помощью волшебного форума
5 Wobland
 
28.10.13
06:55
ТРег в помощь
6 Wobland
 
28.10.13
06:55
(5) хотя, тут не учитывается условие про 5 подряд
7 mehfk
 
28.10.13
07:00
Писал на коленке.
МассивСтрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(МояСтрока, " ");
НоваяСтрока = "";
Для Каждого Эл Из МассивСтрок Цикл

Если СтрДлина(Эл.Значение) > 5 Тогда
ПевыеПятьБукв = Лев(Эл.Значение, 5);
Если ВРЕГ(ПевыеПятьБукв) = ПевыеПятьБукв Тогда
НоваяСтрока =  НоваяСтрока + " " + ВРЕГ(Лев(Эл.Значение,1)) + Нрег(Сред(Эл.Значение, 2, СтрДлина(Эл.Значение) - 1));
Иначе
НоваяСтрока = НоваяСтрока + " " + Эл.Значение;
КонецЕсли;
Иначе
НоваяСтрока = НоваяСтрока + " " + Эл.Значение;
КонецЕсли;
КонецЦикла;
8 mehfk
 
28.10.13
07:03
Тюфу, нужны БУКВЫ, а не символы, тогда 5000 р.
9 Галахад
 
гуру
28.10.13
07:05
(8) Гм. А символы при ВРЕГ меняются, что-ли?
10 2S
 
28.10.13
07:07
(8) "кто ж цифры буквами пишет!?"
11 BalBess
 
28.10.13
07:09
(7) во первых, например SAMS128, он тоже сделает Sams128, что не правильно
во вторых например sAMSUMG, он пропустит, а его тоже надо преобразовывать
12 skunk
 
28.10.13
07:15
(11)этого в первоначальном тз нет
13 Wobland
 
28.10.13
07:16
(12) >заменить на прописные, кроме первой
samsung получается
14 ICWiner
 
28.10.13
07:16
Эм, ну как мне кажется самое простое - перебор символов строки в цикле. Уловие проверки НРег(Символ) <> Символ тогда ыы = ыы + 1. Считаешь сколько символов проходят  по условию, если следующий нрег(символ) = символ смотришь чему равно ыы, если 5 и более - запоминаешь в массиве с какого символа и сколько нужно сдеать нрегом и обнуляешь ыы, если меньше 5 - просто обнуляешь ыы. Короче писанины на 5 минут. На красоту решения не претендую, но оптимизация тут не к чему - отрабатывать будет моментально.
15 2S
 
28.10.13
07:17
(11)
1.разложи в массив по словам
2.все в НРЕГ
3.Первую букву в ВРЕГ
16 Wobland
 
28.10.13
07:18
(15) это называется титульный регистр, автору не подходит
17 2S
 
28.10.13
07:19
(16) обоснуй. По условиям все подходит
18 Wobland
 
28.10.13
07:21
(17) САМС -> Самс
19 catena
 
28.10.13
07:24
sAMSUNG по описанию задачи превратится в sAmsung
20 Wobland
 
28.10.13
07:25
(19) заменить на прописные, кроме первой.
откуда взялся верхний регистр у второго символа?
21 BalBess
 
28.10.13
07:26
(17) Если букв 5 или менее, то оставляем как есть

1.  массив по словам
2. длина слова менее 6, пропускаем
3. считаем перебором, число заглавных букв в слове
4. если больше 5, первая заглавная, остальные прописные

как-то так, только как в п.3 не учитывать цифры?
22 Wobland
 
28.10.13
07:28
(21) п.3 нужно уточнять - нужно ж подряд
23 BalBess
 
28.10.13
07:30
(19) мне нужно в любом случае сделать первую заглавную, остальные прописные,.т.е. sAMSUNG в Samsung

(22) да, с п.3 немного позаморочиться придется

пошел делать...
24 Wobland
 
28.10.13
07:33
не за что
25 Песец
 
28.10.13
07:38
(0) Чем отличаются "заглавные" буквы от "прописных"?
26 Песец
 
28.10.13
07:46
(25+)
Функция ЗаменаЗаглавныхБуквНаПрописные(стр)
Возврат стр;
КонецФункции

:)
27 hhhh
 
28.10.13
08:00
(23) а ACER и SONY?
28 catena
 
28.10.13
08:02
(20)Можно прочитать двояко: "первую букву в слове" и "первую букву в блоке больших букв".
29 Wobland
 
28.10.13
08:05
(28) это если применять фантазию. автор сформулировал вполне недвусмысленно имхо
30 catena
 
28.10.13
08:06
(29)Ну значит я не выспалась :)
31 Wobland
 
28.10.13
08:08
или я. подлежащего там нет. впрочем, пофих
32 Песец
 
28.10.13
08:18
(29) Тогда чего проще:
получаем слово (Ноутбук"SAMSUNG" это одно слово или два?), идем по нему циклом, маленькая буква сбрасывает проверку в ноль, большая увеличивает на единицу. Если проверка доросла до нужного количества - прерываемся, делаем Врег первая буква + Нрег остальные.
33 Песец
 
28.10.13
08:23
(29) У автора написано "если в наименовании товара". Наименование может состоять из разного количества слов, в частности из одного. Надо поднимать первую букву наименования получается. Но из примера следует что надо дербанить наименование по словам (тут надо уточнить что является разделителями слов).
34 BalBess
 
28.10.13
09:15
Такая получилась конструкция

//
Функция КолВоЗаглБуквПодряд(стрТемп, трбКолВо)
    // п.3 подсчитаем кол-во подряд идущих заглавных букв
    КолвоПодряд = 0;
    Для Поз=1 По СтрДлина(стрТемп) Цикл
        КодСим=КодСимв(Сред(стрТемп, Поз, 1));
        // берем только A-Z и А-Я. т.е. с 65-90 и 192-223
        // цифры и знаки препинания не в счет
        Если ((КодСим >= 65) И (КодСим <= 90)) ИЛИ ((КодСим >= 192) И (КодСим <= 223)) Тогда
            КолвоПодряд = КолвоПодряд + 1;
            Если КолвоПодряд > трбКолВо Тогда
                Возврат КолвоПодряд;
            КонецЕсли;
        Иначе    
            КолвоПодряд = 0;
        КонецЕсли;
    КонецЦикла;    
    Возврат КолвоПодряд;
КонецФункции

//
Функция ПреобразоватьНаименование(Вхстрока, трбКолВо = 5)
    ВыхСтрока = СокрЛП(Вхстрока);
    // п.1 разобьем строку на слова, по пробелу
    Пока Найти(ВыхСтрока,"  ")>0 цикл
          СтрЗаменить(ВыхСтрока,"  "," "); // заодно уберем лишние пробелы
    КонецЦикла;
       стрТемп = СтрЗаменить(ВыхСтрока, " ", РазделительСтрок);
    ВыхСтрока = "";
       // п.2 цикл по словам, сразу заменяем и вставляем в выходную строку
    Для х = 1 По СтрКоличествоСтрок(стрТемп) Цикл
        Слово = СтрПолучитьСтроку(стрТемп,х);
        Если стрДлина(Слово) <= трбКолВо Тогда
            ВыхСтрока = ВыхСтрока + Слово + " ";
            Продолжить;
        КонецЕсли;
        КолВоЗаглБуквПодряд = КолВоЗаглБуквПодряд(Слово, трбКолВо);
        Если КолВоЗаглБуквПодряд > трбКолВо Тогда
            Слово = ВРег(Лев(Слово, 1)) + НРег(Сред(Слово,2)); // первая загл, остальные прописные
        КонецЕсли;
        ВыхСтрока = ВыхСтрока + Слово + " ";
    КонецЦикла;

    Сообщить(ВыхСтрока);
    Возврат СокрЛП(ВыхСтрока);
КонецФункции
//----------------------------------------------------------------------------
35 1dvd
 
28.10.13
09:19
(34)
ошибочка
36 1dvd
 
28.10.13
09:19
Если КолВоЗаглБуквПодряд > трбКолВо Тогда
             Слово = ВРег(Лев(Слово, 1)) + НРег(Сред(Слово,2)); // первая загл, остальные прописные

         КонецЕсли;
        ВыхСтрока = ВыхСтрока + Слово + " ";


Два раза слово будет добавляться
37 1dvd
 
28.10.13
09:20
(36) (35) сторно

всё правильно
38 BalBess
 
28.10.13
09:21
проверял на SAMSUNG sAMSUNG SAMSUNg
везде заменяет на Samsung, как мне и надо

Всем спасибо! за советы и помощь
39 Песец
 
28.10.13
09:22
(34) Если КолвоПодряд > трбКолВо Тогда шест букв получается
40 BalBess
 
28.10.13
09:23
PS интеграция товаров на сайт, а сайт не брал товары с наименованием БОЛЕЕ 5 заглавных букв подряд
41 Wobland
 
28.10.13
09:25
(38) и за тестирование
Сообщить(ПреобразоватьНаименование("САМСУНГ"));
----
САМСУНГ
САМСУНГ
42 Wobland
 
28.10.13
09:26
плюс синтаксические ошибки по мелочи
43 Wobland
 
28.10.13
09:27
вот ещё. наслаждайся

Процедура КнопкаВыполнитьНажатие(Кнопка)
    Сообщить(ПреобразоватьНаименование("Самсунг"));
    Сообщить(ПреобразоватьНаименование("сАМСУНг"));
    Сообщить(ПреобразоватьНаименование("САМСунг"));
    Сообщить(ПреобразоватьНаименование("СамсУнГ"));
    Сообщить(ПреобразоватьНаименование("СаМСУНГ"));
    Сообщить(ПреобразоватьНаименование("САМСУНГ"));
КонецПроцедуры

----

Самсунг
сАМСУНг
САМСунг
СамсУнГ
СаМСУНГ
САМСУНГ
44 1dvd
 
28.10.13
09:28
(40) >>сайт не брал товары с наименованием БОЛЕЕ 5 заглавных букв подряд

нафига такой сайт нужен?
45 BalBess
 
28.10.13
09:35
(41) у меня
Сообщить(ПреобразоватьНаименование("САМСУНГ"));
выдает "Самсунг", как и должно быть

(43) все правильно!. Еще раз. Более 5 заглавных символов подряд
46 BalBess
 
28.10.13
09:37
(42) какие еще синтаксические ошибки? речь про 1с77
у меня все работает, код скопирован с конфигуратора

(44) требования сайта (аукцион), чтобы не "пестрили" лоты
47 Мелкая нечисть
 
28.10.13
09:52
офтоп... прописные буквы - это большие и есть. Маленькие называются строчными :-)
48 1dvd
 
28.10.13
09:56
Прописные заменить на заглавные исключая большие кроме высоких
49 Песец
 
28.10.13
10:02
(46) ну а какогох тогда в теме вэ8?! И что возвращает "сАМСУНг", т. е. когда ровно пять букв.
50 BalBess
 
28.10.13
10:15
(49) про тему извиняюсь, вроде v7 нажимал..
если "сАМСУНг", не трогает, т.е. 5 загл. букв
но такие случаи редкие, это уже тема другого ТЗ
51 Infsams654
 
28.10.13
10:29
(47) +100 Прописной буквой называется заглавная буква в предложении. Маленькая буква того же шрифта называется строчной
52 Wobland
 
28.10.13
10:35
а что оно скажет по поводу сAМСУНг?
53 Wobland
 
28.10.13
10:44
кстати, а СтрЗаменить в семёрке - тоже функция?
54 BalBess
 
28.10.13
10:44
(52) я же писал, ничего не сделает, моя задача, чтобы работала выгрузка на сайт, а если менеджеры заводят товар "сAМСУНг", то это не мои проблемы, пусть исправляют в 1с, или на сайте такой товар будет
(47) все верно, я ввел в заблуждение, везде где я писал "прописная" надо заменить на "строчная", короче

стрЗаменить(ВесьТекст, "прописная", "строчная")
55 Wobland
 
28.10.13
10:46
странно это всё. задача - чтоб работала выгрузка. откуда возник (0)?
56 samozvanec
 
28.10.13
10:48
проставить везде первую прописной остальные строчными, если слово без цифр и символов предлагали уже?
57 Wobland
 
28.10.13
10:50
(56) да
58 Vyachelsv
 
28.10.13
10:51
Если Стр = "SAMSUNG" тогда
Стр = "Samsung";
КонецЕсли;
59 BalBess
 
28.10.13
11:00
(55) не вижу ничего странного. В базе 1С товар "Ноутбук SAMSUNG 300V5A", для выгрузки нужно чтобы в наименовании товара было не более 5 загл букв подряд, иначе этот товар не появится на сайте. Это требования сайта (сайт не наш). Чтобы не переименовывать несколько тысяч товаров, проще в обработке поменять имя и все.

(56) не вариант, например SONY, ASUS оставляем как есть
60 Godofsin
 
28.10.13
11:01
(58) Супер!
61 BalBess
 
28.10.13
11:02
(56) плазменный телевизор samsung, получится
"Плазменный Телевизор Samsung"
62 Песец
 
28.10.13
11:03
(50) а, туплю, пять букв не надо менять. Но все равно читабельнее если функция будет возвращать не кол-во букв, а 1 или 0, т. е. надо или не надо преобразовывать.
63 Wobland
 
28.10.13
11:05
(59) тычу пальцем в странное
1) это не мои проблемы, пусть исправляют в 1с, или на сайте такой товар будет
2) не более 5 загл букв подряд, иначе этот товар не появится на сайт
64 Галахад
 
гуру
28.10.13
11:07
(58) Кстате, вполне нормальное решение.
Забацать справочник "Бренды" и если нашел в нем, что Самсунг.
65 samozvanec
 
28.10.13
11:13
(59) ну и на длину строки проверяй + к (56)
66 BalBess
 
28.10.13
11:28
(64) а если будет "НОУТБУК САМСУНГ"

Вот пример с реальной базы: "СНЕГОУБОРЩИК SNAPPER H924RX GROSS TORQUE", а торговая марка у него SIMPLICITY. И что? Мне список ключевых слов составлять, из нескольких тысяч..
У каждого своя задача.. , я для себя сделал
просто думал через регулярки сделать, поэтому обратился на форум
67 1dvd
 
28.10.13
11:31
(66) GROSS останется как есть. Это ж некрасиво
68 BalBess
 
28.10.13
11:50
(67) мне не до красоты, лишь бы товар появился на сайте. К тому же можно вызвать процедуру ПреобразоватьНаименование(Наименование, 4) и будет "красиво"!

Откройте например http://www.avito.ru/vologda?q=ноутбук
увидете, что я пытался всем объяснить. Т.е. нет более 5 загл. букв подряд.
Возьмите свою базу и выгрузите ее на сайт. Все станет ясно ))
69 BalBess
 
28.10.13
11:59
Кстати вкралась таки обшибка. Вместо

    Пока Найти(ВыхСтрока,"  ")>0 цикл
          СтрЗаменить(ВыхСтрока,"  "," "); // заодно уберем лишние пробелы
    КонецЦикла;

заменить на

    Пока Найти(ВыхСтрока,"  ")>0 цикл
          ВыхСтрока = СтрЗаменить(ВыхСтрока,"  "," "); // заодно уберем лишние пробелы
    КонецЦикла;
70 Wobland
 
28.10.13
12:00
(69) до сих пор ни разу не нажал на Сохранить? или семёрка настолько тупая, что молчит?
71 BalBess
 
28.10.13
12:22
(70) семерка молчит, и восьмерка молчала бы. Любую функцию можно использовать как процедуру, просто игнорируя возвращаемое значение.
обработка работала... пока не попался товар с двумя пробелами в наименовании, она зависала в бесконечном цикле.
72 Песец
 
28.10.13
12:24
(71) Восьмерка не молчит, семерка тупая.
73 Wobland
 
28.10.13
12:25
(71) восьмёрка настраивается

{Форма.Форма1.Форма(1,12)}: Встроенная функция может быть использована только в выражении. (СтрЗаменить)
СтрЗаменить<<?>>("", "", ""); (Проверка: Сервер)
{Форма.Форма1.Форма(1,12)}: Встроенная функция может быть использована только в выражении. (СтрЗаменить)
СтрЗаменить<<?>>("", "", ""); (Проверка: Тонкий клиент)
74 svartemov
 
31.10.13
06:21
(0)
(66)
//Лови:

ВходнаяСтрока = "СНЕГОУБОРЩИК SNAPPER H924RX GROSS TORQUE";
ШаблонПоиска = "(?=.*[\W])(?=[А-Яа-яA-Za-z]*[А-ЯA-Z]{5,})([^\s])([^\s]*)";
Попытка
    ScrptCtrl = Новый COMОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language = "JScript";
    ScrptCtrl.AddCode("
    |function Replacer(text, pattern)
    |{
    |return text.replace(new RegExp(pattern,'mg'), function(str, p1, p2){return p1.toUpperCase() +  p2.toLowerCase();});
    |}
    |");    
    СтрокаРезультата = ScrptCtrl.Run("Replacer", ВходнаяСтрока, ШаблонПоиска);
Исключение
    Сообщить(ОписаниеОшибки());
КонецПопытки;
//Пиво пью
75 zak555
 
31.10.13
09:52
(34) >  Если ((КодСим >= 65) И (КодСим <= 90)) ИЛИ ((КодСим >= 192) И (КодСим <= 223)) Тогда

1. в utf8 коды другие
2.