Страницы: 1
RSS
Как вытащить из строки подстроку по маске расположенной в случайном порядке?
 
Здравствуйте!

Не могу вытащить ФИО из текста, в котором нет четкой иерархии, вернее она предусмотрена, но не соблюдается.
1. Формула 1
=ПСТР(A2;НАЙТИ(СИМВОЛ(1);ПОДСТАВИТЬ(A2;"|";СИМВОЛ(1);3))+1;НАЙТИ(СИМВОЛ(1);ПОДСТАВИТЬ(A2;"|";СИМВОЛ(1);3+1))-НАЙТИ(СИМВОЛ(1);ПОДСТАВИТЬ(A2;"|";СИМВОЛ(1);3))-1)
Не всегда работает, потому что не всегда ФИО является третьей по счету, если забыли указать ГОРОД, плюс может попасться комментарий из другого города и тогда порядок совсем рушится.
2. Формула 2
=ПСТР(A2;ПОИСК("* ?.?";A2;1);10)
Вообще не работает, т.к. маска с ФИО получается не уникальной, если есть еще точки в тексте.
Друзья помогите, перерыл кучу примеров в нете, но ничего не помогает решить данную задачу!
Изменено: Юрий М - 25.06.2022 12:21:16
 
titov_s@bk.ru, поменяйте отображаемое имя согласно правилам форума.
Тема читается как вытащить случайным образом построку из строки, а не вытащить что-то , что не имеет четкого расположения. Предложите адекватное название теме, модераторы поменяют.
По вопросам из тем форума, личку не читаю.
 
Имя поменял, спасибо
 
UDF
Код
Function iFio(iCell As Range) As String
Dim re
Set re = CreateObject("VBScript.RegExp")
     re.Global = True
re.Pattern = "[А-ЯЁ][а-яё]+ [А-ЯЁ]\.([А-ЯЁ]\.)?"
    iFio = re.Execute(iCell)(0)
End Function
 
Kuzmich, ну разве название темы нормальное?

=TRIM(RIGHT(SUBSTITUTE(LEFT(A2;5+SEARCH("? ?.?.|";A2&"|"));"|";REPT(" ";99));99))
По вопросам из тем форума, личку не читаю.
 
БМВ, сорри за название темы, но не нашел как самому отредактировать!

Спасибо, формула отлично работает, кроме случая когда (бывает и такое, и к сожалению таких случаев много) после отчества не стоит "." То есть должно быть "Иванов И.И.", по имеем "Иванов И.И" без точки в конце. Лечится конечно легко, заменой ФИО без точки на ФИО с точкой и меня это по большому счету устраивает, но если есть варианты обойти и эту проблему, буду благодарен!
И еще, можно алгоритм работы вашей формулы описать?
 
Цитата
Sergey написал:
не нашел как самому отредактировать
А Вас просили самому редактировать? Вот что Вам писали:
Цитата
БМВ написал:
Предложите адекватное название теме, модераторы поменяют.
 
Цитата
написал:
А Вас просили самому редактировать? Вот что Вам писали:Цитата БМВ  написал:Предложите адекватное название теме, модераторы поменяют.
название вроде бы старое, посмотрел есть ли возможность это делать самому!
Если от меня все таки нужно предложение по названию темы, то "Как вытащить из строки подстроку по маске расположенной в случайном порядке".
 
Цитата
написал:
UDF
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7      Function   iFio(iCell   As   Range)   As   String    Dim   re    Set   re = CreateObject(  "VBScript.RegExp"  )           re.Global =   True    re.Pattern =   "[А-ЯЁ][а-яё]+ [А-ЯЁ]\.([А-ЯЁ]\.)?"          iFio = re.Execute(iCell)(0)    End   Function   
 
Kuzmich, подскажите, как в маску добавить знак "|" ? Всплывают новые подводные камни, в частности попадаются в строке просто ФИО, не обрамленные ||, которые попадают в выборку, а обрамленные || соответственно уже нет.
Если я корректирую код добавляя "|" так (выделил красным):
re.Pattern = "|[А-ЯЁ][а-яё]+ [А-ЯЁ]\.([А-ЯЁ]\.)?|"
выдаются пустые значения почему-то!
Изменено: Sergey - 25.06.2022 12:36:28
 
Sergey,  а Вы можете обойтись без цитирования? Ну какой смысл цитировать код?
 
Цитата
подскажите, как в маску добавить знак "|" ?
Вы в файле покажите варианты написания ФИО в ячейке и какой результат вы желаете получить
Цитата
Если я корректирую код добавляя "|" так
Надо вставлять \|
Изменено: Kuzmich - 25.06.2022 23:11:11
 
Sergey,
вам нужно решение?  всем остальным оно на фиг не нужно (для понимания ситуации)
так и пишете предложенный вами вариант не сработал в строке ХХ моего файла
тот, кто решал задачу смотрит в строку ХХ, понимает что нужно исправить, исправляет (или бросает это все и вы дальше решаете свою задачу самостоятельно, еще раз - никому, кроме вас решение на фиг не нужно! никому, но из спортивного интереса при наличии постановки задачи - сделать можно, потому что любая решенная тут задача ничего у меня не забирает, а лишь добавляет навыков решений и может пригодиться для реальной задачи именно так я и осваивал программирование - решая любые практические (а иногда и нет) задачи, именно так я все еще совершенствую свои навыки или чаще всего, просто так провожу свободное время)
Изменено: Ігор Гончаренко - 26.06.2022 00:40:04
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Kuzmich, спасибо большое, получилось (файл приложил), но:
1. при этом стали отображаться сами знаки "|", а они не нужны
2. в случае если после ФИО нет точки (к сожалению бывает), получаем #ЗНАЧ!
В строке под №3 (которых вобрал в себя все возможные вариации данных) результат работы макроса, а так же то, как хотелось бы, что бы выглядел результат!
Если возможно получить такой результат, можете еще раз помочь?
Спасибо!
 
Если в последнем примере все варианты, то с минимальной правкой формулы БМВ, - обработка инициалов с точкой и без.
Код
=IFERROR(TRIM(RIGHT(SUBSTITUTE(LEFT(B2;5+SEARCH("? ?.?.|";B2&"|"));"|";REPT(" ";99));99));TRIM(RIGHT(SUBSTITUTE(LEFT(B2;5+SEARCH("?? ?.?|";B2&"|"));"|";REPT(" ";99));99)))
 
Можно выделить сначала xml: ФИЛЬТР.XML(ПСТР(B2;ПОИСК("<";B2);ДЛСТР(B2));"//*"), а далее его обработать с учетом что ФИО 4-ая запись с конца
Код
=ФИЛЬТР.XML("<j><i>"&ПОДСТАВИТЬ(ФИЛЬТР.XML(ПСТР(B2;ПОИСК("<";B2);ДЛСТР(B2));"//*");"|";"</i><i>")&"</i></j>";"//i["&СЧЁТЗ(ФИЛЬТР.XML("<j><i>"&ПОДСТАВИТЬ(ФИЛЬТР.XML(ПСТР(B2;ПОИСК("<";B2);ДЛСТР(B2));"//*");"|";"</i><i>")&"</i></j>";"//i"))-4&"]")
Изменено: Тимофеев - 26.06.2022 13:37:34
 
Цитата
возможно получить такой результат
Используйте
Код
Function iFio(iCell As Range) As String
Dim re
Set re = CreateObject("VBScript.RegExp")
     re.Global = True
'     re.MultiLine = True
re.Pattern = "\|([А-ЯЁ][а-яё]+ [А-ЯЁ]\.[А-ЯЁ]\.?)\|"
    iFio = re.Execute(iCell)(0).SubMatches(0)
End Function
 
С FILTERXML можно и попроще, только терзают меня смутные сомнения насчет постоянства позиции с конца.
Код
=FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B2;"<";"|");">";"|");"|";"</s><s>")&"</s></t>";"//s[last()-6]")
 
Цитата
написал:
Используйте
Все работает отлично! Спасибо огромное!  
 
Цитата
написал:
С FILTERXML можно и попроще, только терзают меня смутные сомнения насчет постоянства позиции с конца.
memo, к сожалению постоянства нет (с эту строку сливаются комментарии из разных каналов продаж, там могут написать все что угодно, кто во что горазд, в нашем канал есть шаблон с "|....|" между двумя <ГПП>, плюс сотрудник может добавить любые комм вне этого шаблона для себя, как до так и после, плюс комм от других каналов, а может быть только комм с "|.....|" между двумя <ГПП>), на этих трех примерах сработало отлично, но когда применил на всех на 1,5 тыс строк, вылезло много не тех данных!
Формула берет все данные между |    |, но попадаются не только ФИО, но и даты, города, услуги.
Спасибо за вариант!
 
Цитата
написал:
Если в последнем примере все варианты, то с минимальной правкой формулы  БМВ , - обработка инициалов с точкой и без.
Пропустил Ваше сообщение, проверил, работает как надо!!! Спасибо большое!
Страницы: 1
Наверх