helpf.pro
Регистрация

v8: Функция Сред()

alex81nzp
17.01.2012 08:49Прочитано: 8333
Здравствуйте!
Никак не могу разобраться в чем дело...
Есть строка: "2* 9560; 2* 9650; 2* 9700;", из нее нужно выделить числа до знака "*" - первое число и между "*" и ";" - второе. Делаю так: Считаю количество вхождений ";" и задаю цикл на это количество, в котором из общей строки, назовем её СТРОКА, выделяю первую часть до знака ";" это будет переменная ПОДСТРОКА, затем из подстроки выделяю ЧИСЛО1 до знака "*", а второе ЧИСЛО2 от знака "*" до ";". Далее из СТРОКА убираю слева количество символов ПОДСТРОКА и повторяю цикл. В итоге получаю, что ЧИСЛО2 со знаком ";"
Для выделения из строки использую функцию Сред(<Строка>,<№ первого символа><№ последнего символа>)
Код 1C v 8.х
 
Строка = "2*9560; 2* 9650; 2*9700;";
ПодСтрока = "";
Для ккк = 1 По СтрЧислоВхождений(Строка,";") Цикл

Строка = Прав(Строка,СтрДлина(Строка)-СтрДлина(ПодСтрока));
ПодСтрока = Лев(Строка,Найти(Строка,";"));

Сообщить (Строка);
Сообщить (ПодСтрока);

Число1 = Лев(ПодСтрока,Найти(ПодСтрока,"*")-1);
Число2 = Сред(ПодСтрока,Найти(ПодСтрока,"*")+1,Найти(ПодСтрока,";")-1);
Сообщить(Число1+", "+Число2);

КонецЦикла;


Здается мне, что третий параметр, который можно опустить, становиться равен 0 из-за этого выбирается вся строка до конца, что я делаю не так, помогите пожалуйста разобраться!
Изменено 17.01.12 10:39:08
Yandex
Возможно, вас также заинтересует
Реклама на портале
ad82117
17.01.2012 09:54Ответ № 1
Для начала -
не используйте переменные с названием "Строка", "Число" и т.п.!!!

попробуйте через "найти" и от полученной позиции через "Сред"

т.е. Вам нужно из "260; 2* 9650; 200;" получить:
1. "260" и "2"
2. "9650"

правильно?
Изменено 17.01.12 10:20:48
alex81nzp
17.01.2012 10:38Ответ № 2
Ну там на самом деле не 260, а строка "2 * 9560; 2 * 9650; 2 * 9700;"
и Да, мне нужно одной переменной присвоить значение 2, а другой 9560
ad82117
17.01.2012 11:03Ответ № 3
1. "9650" это первые "9560" или вторые "9560"
2. Какая ";" является границей разбора строки?
3. на стадии формирования этой строки не проще ли выдернуть то, что нужно, чем потом разбором заниматься
вот Вам пример, правда, на старой строке

&НаКлиенте
Процедура ляля(Команда)
Стр = "260; 2* 9650; 200;";
Длина = СтрДлина(Стр);
Для ккк = 1 по СтрЧислоВхождений(Стр,"*") цикл
Й = Найти(Стр,"*");
ЛеваяДлина = Длина - (Длина - й + 1);
ПраваяДлина = Длина - й;
ЛеваяЧасть = Лев(Стр,ЛеваяДлина);
ПраваяЧасть = Прав(Стр,ПраваяДлина);
КонецЦикла;
КонецПроцедуры

получаете СтрДлина(), потом обычная математика и через Сред() (я не стал дальше писать)
alex81nzp
17.01.2012 11:34Ответ № 4
Мне все три группы нужны!
2 * 9560;
2 * 9650;
2 * 9700;
Для этого они и отделены знаком ";". Я пользовался функция Найти ( ПодСтрока,";" ) дает нужное число (номер) символа, но вот такой код:
Код 1C v 8.х
 Сред(ПодСтрока, Найти (ПодСтрока,"*")+1, Найти(ПодСтрока,";")-1)   
дает в итоге 9560; , а мне нужно только 9560 !

Может кто подскажет про Регулярную функцию? Можно ли брать текст из строки по шаблону? Как проверять строку на количество вхождений и соответствие шаблону я понял.
Хотелось бы примерчик
ad82117
17.01.2012 11:54Ответ № 5
1. "дает в итоге 9560; , а мне нужно только 9560 !" - а кто будет убирать ещё один знак?!
дело ведь в том, что ";" имеет позицию 9, 19, 29.
Вам нужно получить все символы, которые стоят ДО 9, 19 и 29.
Вот обычной математикой Вы их и получите.
а потом, путем отсечения нужных Вам чисел, возвращайте форматную строку и снова её разбирайте
чем проще Вы сделаете для себя форматную строку, тем будет лучше.
2. "Может кто подскажет про Регулярную функцию? Можно ли брать текст из строки по шаблону" --- об'ясните, пожалуйста, подробно, что Вы хотите
3. Хотелось бы примерчик --- пример чего?
alex81nzp
17.01.2012 12:36Ответ № 6
Вам нужно получить все символы, которые стоят ДО 9, 19 и 29.
Код 1C v 8.2 УП
 Сред(ПодСтрока, Найти (ПодСтрока,"*")+1, Найти(ПодСтрока,";")-1)    

Выбрать строку из строки "2 * 9560; " начиная со знака следующего после знака "*" ( Найти (ПодСтрока,"*")+1 ), и кончая знаком предшествующим знаку ";" ( Найти(ПодСтрока,";")-1 )

Собственно помощь в этом уже не требуется, сделал вот так:
Код 1C v 8.2 УП
 
Строка = "2* 9560;2* 9650; 2* 9700;";
ПодСтрока = "";
Для ккк = 1 По СтрЧислоВхождений(Строка,";") Цикл
ПодСтрока = Лев(Строка,Найти(Строка,";")-1);
Цифра1 = Число(Лев(ПодСтрока,Найти(ПодСтрока,"*")-1));
Цифра2 = Число(Сред(ПодСтрока,Найти(ПодСтрока,"*")+1));
Сообщить("Первое число - "+ Цифра1);
Сообщить("Второе число - "+ Цифра2);
Сообщить("______________________________________________________________");
Строка = Прав(Строка,СтрДлина(Строка)-СтрДлина(ПодСтрока)-1);
КонецЦикла;


"Может кто подскажет про Регулярную функцию? Можно ли брать текст из строки по шаблону" --- об'ясните, пожалуйста, подробно, что Вы хотите

Хочется собственно научиться пользоваться Регулярными выражениями, например вот для описанного мною случая
Изменено 17.01.12 12:37:25
alex81nzp
17.01.2012 12:45Ответ № 7
Да и Символ ";" не обязательно будут стоять на 9, 19, 29 месте! Это просто для примера и если приглядется, то станет видно, что содержимое переменной "Строка" явно не по шаблону заведено. В реальности второе число будет колебаться от четырехзначного до пятизначного, а может и 6-ти. Для верности можно еще СокрЛП() добавить )
ad82117
17.01.2012 14:06Ответ № 8
&НаКлиенте
Процедура ляля(Команда)
Стр = "2* 9560; 2* 9650; 2* 9700;";
Стр = СтрЗаменить(Стр," ","");
// 2*9560;2*9650;2*9700;
ФорматСтрока = "";
Скока = СтрЧислоВхождений(Стр,";");
Для ккк = 1 по Скока цикл
Й = Найти(Стр,";");
ФорматСтрока = Лев(Стр,й-1);
//Далее разбор ФорматСтрока
ДлинаФорматСтрока = СтрДлина(ФорматСтрока);
ФорматСтрока = СтрЗаменить(ФорматСтрока,";","");
Для ккк = 1 по СтрЧислоВхождений(ФорматСтрока,"*") цикл
ЙК = Найти(ФорматСтрока,"*");
ЛеваяДлина = ДлинаФорматСтрока - (ДлинаФорматСтрока - йк + 1);
ПраваяДлина = ДлинаФорматСтрока - йк;
ЛеваяЧасть = Лев(ФорматСтрока,ЛеваяДлина);
Сообщить("Л " + ЛеваяЧасть);
ПраваяЧасть = Прав(ФорматСтрока,ПраваяДлина);
Сообщить("П " + ПраваяЧасть);
КонецЦикла;
//Теперь нужно плучить строку "2*9650;", потом "2*9700;"
СколькоОсталосьОтСтр = СтрДлина(Стр) - ДлинаФорматСтрока;
Стр = Прав(Стр, СколькоОсталосьОтСтр - 1);
Если ккк = 1 тогда
прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

Вы немного не поняли суть предыдущего кода!
Я просто показал принцип, каким пользуюсь я!
а дальше просто логически!

хоть сколько угодно разделителей ";"
главное, чтобы была "*"
любая структура хоть
"хх*х; ххххх*хххххххххххх; х*х" и т.д.

или я Вас опять не понял?
Изменено 17.01.12 14:19:28
alex81nzp
17.01.2012 14:28Ответ № 9
Да, спасибо, я Вас понял! У меня все тоже самое, только не так подробно расписано, но принцип тот же )
Думаю тему можно закрывать!
Подсказка: Щелкнув по значку (справа от названия вопроса), вы получите список ответов на похожие вопросы!
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.