Страницы: 1
RSS
Вытащить № судебного дела из слипшегося текста
 
Добрый день)
Во вложении в столбце К, текст вида
(ИП1667/19/11002-ИП); ИД № 2-4152/2017 от 10.01.2018г. должник - Чекина Екатерина Васильевна 169905, Россия, г. Воркута, ул.Матвеева, д.6, кв.33
из него мне нужно получить только это.
2-4152/2017

Попытался регуляркой вытащить но не всегда получается потому что где то отсутствует "от" где то нет пробелов, где то слитно сразу дата? бывает что нет двойки - типо 4152/2017 а надо чтобы получилось в итоге 2-4152/2017, в примере такое тоже имеется.
В файле мои попытки.

(\s2-\.?).*от
это работает то когда именно формат как выше написал( но есть нюансы. смотрите в файлике которые не получились. не получается написать универсально.
Не претендую на регулярки, может по доброте, душевной кто-то напишет VBA или PQ.
я пытался :(
Изменено: Wild.Godlike - 28.06.2019 16:19:20
 
Решение в лоб 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, вы просили выловить номер, я его выловил. Исправлять косяки от кривых ручек операторов, которые вносят данные вы не просили. Что в исходнике, то и в результате. :D
З.Ы. О, просили, значит я пропустил, но тем не менее, если там везде ИД перед дефисом, то в коде замените его на 2, и всего делов, А чтобы вылавливать косяки, достаточно отсортировать список и все косяки либо всплывут вверх, либо утонут вниз, это уж как отсортируете.
Изменено: PooHkrd - 28.06.2019 16:29:02
Вот горшок пустой, он предмет простой...
 
Код
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.06.2019 16:30:50
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, Приветствую) Смотрите в файлике по моей регулярке 28 ошибок, по вашей 33. в рабочих файлах ещё больше разница.
PooHkrd, ))) ну я бы был очень раз оторвать ручки спецам в сбербанке)))) но что имеем) в любом случае пока что ваш вариант с самым минимальным кол-вом ошибок)
Изменено: Wild.Godlike - 28.06.2019 16:41:45
 
Вот такой паттерн у меня вышел  :)
Код
([ИД]|\d{1,2})[-]\d+[/]\d+
Формула
=RegExpExtract(ПОДСТАВИТЬ(K2;" ";"");V2)
Изменено: Sanja - 28.06.2019 16:57:14 (Заменил файл)
Согласие есть продукт при полном непротивлении сторон
 
пробуйте это:
Код
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 строк....из-за детского садика(
Изменено: vl.sl - 28.06.2019 16:54:30
 
Ігор Гончаренко, Всего 6) столбик AB ваш результат, как раз именно ошибки связанные с самым противным) но спасибо большое)
Цитата
Wild.Godlike написал:
бывает что нет двойки - типо 4152/2017 а надо чтобы получилось в итоге 2-4152/2017, в примере такое тоже имеется.
vl.sl, Добрый день) ваш столбик AD...у меня почему то 129 ошибок
и после запуска макроса поругался на
36 строку кода.
Код
RegularExpression = Matches.Item(0).FirstIndex

Sanja,Рад приветствовать. у вас 7 ошибок) на 1 больше чем у игоря и с теме же строчками проблема) столбики в файлике подписаны)
Изменено: Wild.Godlike - 28.06.2019 17:13:11
 
Цитата
Wild.Godlike написал: Всего 6)
Вот в сообщении 7 ошибок нет вовсе, но меня сегодня весь день игнорируют...
Изменено: Sanja - 28.06.2019 17:23:47
Согласие есть продукт при полном непротивлении сторон
 
Sanja, , Прошу прощения я вам тоже набирал сообщение но браузер глюкнул и опубликовалось только авто сохраненное. дополнил сообщение выше.
 
1 ошибка  :)  
Изменено: Sanja - 28.06.2019 17:47:57
Согласие есть продукт при полном непротивлении сторон
 
Sanja, Аааа понял почему у нас с вами разница, я когда тему создал не тот файлик добавил, вы видать его сразу скачали, я через 15 минут заметил, и поменял файлик в #1. (((((
 
Вот, вроде без ошибок. UDF+штатные функции
Код
Паттерн
([ИД]|\d{1})[-]\d+[/]\d+
Формула
=ЗАМЕНИТЬ(RegExpExtract(ПОДСТАВИТЬ(K2;" ";"");V2);1;1;2)
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Wild.Godlike написал: поменял файлик в #1.
В новом файле. 3 ошибки.
вот это совсем не знаю как победить
Цитата
282/201820.07.2018 г
Согласие есть продукт при полном непротивлении сторон
 
как вариант, формулы. можно продолжить расширять формулу вариантами)
 
Цитата
282/201820.07.2018 г
это ошибка в данных - пробел не поставили между значениями, но и это решается)
Код
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
Изменено: Ігор Гончаренко - 28.06.2019 18:47:49
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Товарищи дико извиняюсь, что вчера пропал, на работе инет отвалился.
Sanja,  Спасибо большое :) за решение и вариант регулярки :) [] почему-то в сторону этих скобок вообще не думал (
Ігор Гончаренко,  :oops:  8-0 это вообще законно то что вы сделали? Премного благодарен. Провел тесты в сумме на 12тысяч строчек. 0000 ошибок. это идеально :) . я даже не мечтал о таком. единственное в некоторых местах получается 2- 1235/2018 пробел после - но ctrl+h, 1 секунда. и всё готово.
artyrH, Спасибо за уделённое внимание) дико интересно посмотреть как это формулами делается. но ваш файл у меня не открывается на 3 компах. просто весит на открытие excel. несколько раз пытался открыть. (см. спойлер)
Скрытый текст
 
Wild.Godlike, я свой же файл скачал и открыл. его же закидываю по новой и формулу незамысловатую, которую можно продолжить
Код
=ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ЕСЛИОШИБКА(ПСТР(K2;ПОИСК("2-????/???? ";K2);11);ПСТР(K2;ПОИСК("2-????/?? ";K2);9));ПСТР(K2;ПОИСК("2-???/???? ";K2);10));ПСТР(K2;ПОИСК("№*/???? ";K2)+1;7+ПОИСК("???/???? ";K2)-ПОИСК("№*/???? ";K2)));ПСТР(K2;ПОИСК("2-????/????г";K2);11));ПСТР(K2;ПОИСК("2-????/??г";K2);9));ПСТР(K2;ПОИСК("2-???/????г";K2);10))
 
artyrH, Спасибо большое :) не думал что так просто можно) поиграюсь.
 
Руки поотрывать тем, кто так "унифицированно" заполняет!
 
Цитата
Юрий М написал:
Руки поотрывать тем, кто так "унифицированно" заполняет!
Юра, нельзя этого делать
кто же тогда будет поставлять работу тем, кто может это разобрать?
кстати,
на этой задаче возникла и реализована идея алгоритма поиска нужных данных на массиве Patternов RegExp, когда используется не 1 ну о-о-о-о-о-о-очень навореченный  Pattern, а массив разных, от остро заточенных на данные к все более и более широким и свободным, пока первый из них не сработает и судя по отчету Wild.Godlike все сработало)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, я тоже хотел отметить необычность и эффективность такого подхода от частного к общему - взял на вооружение  :idea:
Изменено: Jack Famous - 29.06.2019 13:49:11
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх