Добрый день) Во вложении в столбце К, текст вида (ИП1667/19/11002-ИП); ИД № 2-4152/2017 от 10.01.2018г. должник - Чекина Екатерина Васильевна 169905, Россия, г. Воркута, ул.Матвеева, д.6, кв.33 из него мне нужно получить только это. 2-4152/2017
Попытался регуляркой вытащить но не всегда получается потому что где то отсутствует "от" где то нет пробелов, где то слитно сразу дата? бывает что нет двойки - типо 4152/2017 а надо чтобы получилось в итоге 2-4152/2017, в примере такое тоже имеется. В файле мои попытки.
(\s2-\.?).*от это работает то когда именно формат как выше написал( но есть нюансы. смотрите в файлике которые не получились. не получается написать универсально. Не претендую на регулярки, может по доброте, душевной кто-то напишет VBA или PQ. я пытался
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
#"Duplicated Column" = Table.DuplicateColumn(Source, "Назначение", "Копия Назначение"),
#"Extracted Text Before Delimiter1" = Table.TransformColumns(#"Duplicated Column", {{"Назначение", each Text.BeforeDelimiter(_, "ешение судебного"), type text}}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Text Before Delimiter1", "Назначение", Splitter.SplitTextByEachDelimiter({"/"}, QuoteStyle.Csv, true), {"Назначение.1", "Назначение.2"}),
#"Extracted Text Before Delimiter" = Table.TransformColumns(#"Split Column by Delimiter", {{"Назначение.2", each Text.BeforeDelimiter(_, " "), type text}}),
#"Replaced Value2" = Table.ReplaceValue(#"Extracted Text Before Delimiter","- ","-",Replacer.ReplaceText,{"Назначение.1"}),
#"Extracted Text After Delimiter" = Table.TransformColumns(#"Replaced Value2", {{"Назначение.1", each Text.AfterDelimiter(_, " ", {0, RelativePosition.FromEnd}), type text}}),
#"Merged Columns" = Table.CombineColumns(#"Extracted Text After Delimiter",{"Назначение.1", "Назначение.2"},Combiner.CombineTextByDelimiter("/", QuoteStyle.None),"Сведено"),
#"Replaced Value" = Table.ReplaceValue(#"Merged Columns","г.","",Replacer.ReplaceText,{"Сведено"}),
#"Replaced Value1" = Table.ReplaceValue(#"Replaced Value","№","",Replacer.ReplaceText,{"Сведено"})
in
#"Replaced Value1"
PooHkrd, Спасибо за уделённое внимание) Я так понимаю решение влоб это конкретно под этот файл пример? а потом такие нюансы как например 155 строка ручками искать по фильтру и править. Т.к. проверил на рабочих файлах где больше 1000 строк в каждом. в основном не отрабатывает как раз вот такой случай
Цитата
Wild.Godlike написал: бывает что нет двойки - типо 4152/2017 а надо чтобы получилось в итоге 2-4152/2017, в примере такое тоже имеется.
Wild.Godlike, вы просили выловить номер, я его выловил. Исправлять косяки от кривых ручек операторов, которые вносят данные вы не просили. Что в исходнике, то и в результате. З.Ы. О, просили, значит я пропустил, но тем не менее, если там везде ИД перед дефисом, то в коде замените его на 2, и всего делов, А чтобы вылавливать косяки, достаточно отсортировать список и все косяки либо всплывут вверх, либо утонут вниз, это уж как отсортируете.
Public Function RegExpNum(Text As String) As String
Dim regex
Set regex = CreateObject("VBScript.RegExp"): regex.Pattern = "(№|N) *(2-(\d|/)+)"
If regex.test(Text) Then RegExpNum = regex.Execute(Text)(0).submatches(1)
End Function
Ігор Гончаренко, Приветствую) Смотрите в файлике по моей регулярке 28 ошибок, по вашей 33. в рабочих файлах ещё больше разница. PooHkrd, ))) ну я бы был очень раз оторвать ручки спецам в сбербанке)))) но что имеем) в любом случае пока что ваш вариант с самым минимальным кол-вом ошибок)
Function RegExpNum(Text As String) As String
Dim re
Set re = CreateObject("VBScript.RegExp"): re.Pattern = "(№|N|ИЛ|СП)* *(2*- *(\d|/)+)"
If re.test(Text) Then RegExpNum = re.Execute(Text)(0).submatches(1)
End Function
сколько ошибок так?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Sub rneig()
Dim Iter1 As String
For i = 2 To 414
Start = UCase(ThisWorkbook.Sheets(1).Cells(i, 11))
posNom1 = InStr(Start, "№")
posNom2 = InStr(Start, "N")
If posNom1 > 0 Then
Iter1 = Split(Start, "№")(1)
posNom = posNom1
ElseIf posNom2 > 0 Then
Iter1 = Split(Start, "N")(1)
posNom = posNom2
End If
posot = InStr(posNom, Start, "ОТ")
posOther = RegularExpression(Iter1, "/(\d){2}")
If posot > 0 Then
Iter1 = Split(Iter1, "ОТ")(0)
ElseIf posOther > 0 Then
Iter1 = Mid(Iter1, 1, posOther + 4)
End If
ThisWorkbook.Sheets(1).Cells(i, 30) = Iter1
Next i
End Sub
Function RegularExpression(FindIn As String, Expr As String) As String
Set RegExp = CreateObject("VBScript.RegExp")
With RegExp
.Global = False 'Все совпадения или только первое?
.IgnoreCase = True 'Регистр неважен?
.MultiLine = True 'Игнорировать переносы строк?
.Pattern = Expr
End With
Set Matches = RegExp.Execute(FindIn)
RegularExpression = Matches.Item(0).FirstIndex
Set Matches = Nothing
Set RegExp = Nothing
End Function
Все ОК, кроме 291 и 340 строк....из-за детского садика(
Sanja, Аааа понял почему у нас с вами разница, я когда тему создал не тот файлик добавил, вы видать его сразу скачали, я через 15 минут заметил, и поменял файлик в #1. (((((
это ошибка в данных - пробел не поставили между значениями, но и это решается)
Код
Function RENum(Text As String) As String
Dim RE, p, s, i&
p = Array("(№|N|ИЛ|СП|ИД)* *(2- *(\d|/){7,11})( |г)", "(№|N|ИЛ|СП|ИД)* *(- *(\d|/){7,11})( |г)", _
"(№|N|ИЛ|СП|ИД)* *((\d|/){7,11})( |г)", "(.)((\d|/){7,11})")
Set RE = CreateObject("VBScript.RegExp"): s = Array("", "2", "2-", "2-")
RE.Pattern = "\d{1,2}\.\d+\.\d+": If RE.test(Text) Then Text = RE.Replace(Text, " ")
For i = LBound(p) To UBound(p)
RE.Pattern = p(i): If RE.test(Text) Then RENum = s(i) & RE.Execute(Text)(0).submatches(1): Exit For
Next
End Function
Товарищи дико извиняюсь, что вчера пропал, на работе инет отвалился. Sanja, Спасибо большое за решение и вариант регулярки [] почему-то в сторону этих скобок вообще не думал ( Ігор Гончаренко, это вообще законно то что вы сделали? Премного благодарен. Провел тесты в сумме на 12тысяч строчек. 0000 ошибок. это идеально . я даже не мечтал о таком. единственное в некоторых местах получается 2- 1235/2018 пробел после - но ctrl+h, 1 секунда. и всё готово. artyrH, Спасибо за уделённое внимание) дико интересно посмотреть как это формулами делается. но ваш файл у меня не открывается на 3 компах. просто весит на открытие excel. несколько раз пытался открыть. (см. спойлер)
Юрий М написал: Руки поотрывать тем, кто так "унифицированно" заполняет!
Юра, нельзя этого делать кто же тогда будет поставлять работу тем, кто может это разобрать? кстати, на этой задаче возникла и реализована идея алгоритма поиска нужных данных на массиве Patternов RegExp, когда используется не 1 ну о-о-о-о-о-о-очень навореченный Pattern, а массив разных, от остро заточенных на данные к все более и более широким и свободным, пока первый из них не сработает и судя по отчету Wild.Godlike все сработало)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄