Страницы: 1
RSS
Извлечь ИНН из текста
 
Задача такая: имею столбец с совершенно криворукими названиями клиентов, которые записаны черти как, абсолютно не системно и не однотипно, но в какой то части их названия присутствует ИНН, который собственно нужно извлечь.
Задача упрощается тем, что слава богу кто-то все-таки догадался перед числовым номером ИНН писать сами буквы "ИНН", поэтому начальную позицию забора текста вычислить не сложно. Но после самого номера ИНН-на еще может продолжаться текст, и ИНН после своего окончания отделен от этого текста либо запятой, либо пробелом, либо открывающей или закрывающей скобкой.
И вот конечную позицию ИНН-на собственно нужно определить позицией первой встречающейся запятой, пробела или открывающей/закрывающей скобки в строке, в которой все до начала самого номера ИНН-на уже откинуто. Как то никогда не доводилось использовать комбинацию =ПОИСК(ИЛИ(искомый текст1; искомый текст2)...     Сейчас к своему удивлению выяснил, что такая комбинация не работает.
Можно конечно это решить через ЕСЛИОШИБКА(ПОИСК(",";текст где ищем);ЕСЛИОШИБКА(ПОИСК(" ";текст где ищем);ЕСЛИОШИБКА(ПОИСК("(";текст где ищем);ЕСЛИОШИБКА(ПОИСК(")";текст где ищем)...     Но это в данном случае у меня всего 4 варианта окончания номера ИНН. А если их будет 100? Не вариант 100 раз писать ЕСЛИОШИБКА (да и длины ячейки не хватит).

Код
ПОДСТАВИТЬ(текст;ИЛИ(",";" ";"(";")");"*")
тоже не работает.

Как можно емко определить номер позиции одного из четырех искомых символов, который первым встретится в тексте ячейки?
 
А что, ИНН по количеству символов разные?
Предврительня подготовка: инструмент НАЙТИ-ЗАМЕНИТЬ, меняекм на 5-6 пробелов (с запасом, для гарантии) скобку, запятую, чтотамеще. После этого применяем формулу:
=СЖПРОБЕЛЫ(ПСТР(Таблица1[@Клиент];НАЙТИ("ИНН";Таблица1[@Клиент])+3;13))
13 - На 1 больше максимальной длины ИНН. Но если между словом "ИНН" и ИНН встречается больше одого символа, то число нужно ставить больше.

Цитата
ИЛИ(",";" ";"(";")")... тоже не работает.
И правильно не работает. Синтаксис неправильный.
 
Разные, в 12 строке например.
Здесь естественно только маленький кусочек базы приведен, в оригинале там десятки тысяч строк.
Изменено: VasiliY_Seryugin - 18.06.2020 00:01:31
 
Цитата
инструмент НАЙТИ-ЗАМЕНИТЬ
не хотелось бы им, хотелось бы чисто формулой, чтоб было универсальное решение на случай, если вариантов окончания будет значительно больше четырех.

Цитата
И правильно не работает. Синтаксис неправильный.
Вероятно. Если поясните почему именно не правильный буду очень благодарен!
 
Не надо пояснять, я сам понял почему:) Потому что там должны быть логические значения, а не просто варианты искомого текста.
 
UDF
Код
Function INN(cell$)
 With CreateObject("VBScript.RegExp")
     .Global = True
     .Pattern = "ИНН\s?(\d{10,12})"
     INN = .Execute(cell)(0).SubMatches(0)
 End With
End Function
 
Цитата
VasiliY_Seryugin написал: если вариантов окончания будет значительно больше четырех...
...то никакая формула не угадает, какие там варианты могут быть еще... Появится какая-нибудь закорючка, которая в формуле не предусмотрена... А если будет в тексте: "ИНН этого объекта-субъекта ИНН 111111" или какое-нибудь "ДЛИННОШЕЕЕ"- пиши пропало.
Универсальным может быть макрос, который будет проверять наличие слова или фрагмента "ИНН", определять. что после него находится, вычленять из текста только числовое значение.

Формулу такую тоже можно соорудить, но
Цитата
в оригинале там десятки тысяч строк
и на таких данных книга повесится и будет уговаривать пользователя последовать за ней :)
 
Kuzmich,  работает, спасибо!
У меня к сожалению не достаточно знаний VBA чтобы понять, как именно и почему именно оно работает, но я попробую это понять :)
 
Если нужен ИНН с хвостиком, то
Код
Function INN_(cell$)
 With CreateObject("VBScript.RegExp")
     .Global = True
     .Pattern = "\d{10,12}(.+)?$"
     INN_ = .Execute(cell)(0)
 End With
End Function
 
vikttur, ок, спасибо!
Приобретение понимания того, что формулой это сделать невозможно, это тоже ценное для меня знание. Доверюсь и не буду тратить тучу времени на то, чтоб сам к этому пониманию прийти.
 
Вот тут же на форуме нашел вариант формулы с извлечением из строки всей последовательности цифр, идущих одна за другой.
Может кому пригодится потом, кто через поиск темы сюда придет.

Массивная функция:
Код
=ПСТР(A2;ПОИСКПОЗ(ИСТИНА;ЕЧИСЛО(ПСТР(A2;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2)));1)*1);0);СУММ(ЕЧИСЛО(ПСТР(A2;СТРОКА(ДВССЫЛ("1:"&ДЛСТР(A2)));1)*1)*1))


Пример во вложении.
 
Такая точно подвесит Ваши десятки тысяч строк. И работает при условии, что в тексте леее ИНН гарантированно нет цифр
Страницы: 1
Наверх