Добрый день, Товарищи) Почему не в ветке "работа".Тема создана специально для тех кто любит поковыряться в чём нибудь интересном т.д. просто интересно есть ли более лучшие варианты чем Fuzzy lookup. И не устраивать же кастинг в ветке "работа" в стиле кто лучше и быстрее(такое вроде низя) Собственно всё что описано ниже решается Fuzzy lookup с настройкой 0,8 точности (уже испытано и верчено 100500 раз, но довольно таки не быстро, 1000 строк примерно за 20 минут... и не прям 100% сопоставляет но это не страшно) Итак: Нам надо сопоставить РР с Базой В файле есть 2 листа (РР и БАЗА)(третий лист как раз то в каком ввиде я хочу видеть результат) не обязательно на отдельный лист(ниже пояснения) Нужно сопоставить "Адрес (местоположение):" с лита РР, "Ключ АДРЕС" с листа База.(написание адресов разное) При совпадении вывести все данные с листа база по строке, а с листа РР только которые отмечены зелёным и красным.(если на отдельный лист) Или подставить на листе РР все данные с листа База (если на лист РР) Кол-во строк на листах не совпадает. На листе РР по столбцу "Адрес (местоположение):" могут быть дубли НО "кадастровый номер" разный В связи с этим нескольким строкам на листе РР может соответствовать 1 строка с листа База и она должна быть в каждой из этих строк.
Теперь немного оффтопик(и свои мысли)
Ключ АДРЕС столбец склеивал для надстройки Fuzzy lookup формулу не стал убирать. Есть идея как сопоставлять но руки у меня выглядят примерно вот так (\/) ^_^ (\/) по этому сам реализовать не смогу. В столбце "Адрес (местоположение):" на листе РР. Всегда идёт такой порядок но могут быть отсутствия.(ниже опишу порядок) Республика, город, село(пгт, и тд.), улица, дом, квартира. (Любого из этого может не быть, но порядок всегда один) На листе база есть столбцы CDEF (Населённый пункт, улица, дом,квартира). Если в столбце С не "Воркута" подставляем значение "Воркута"а затем значение уже из этой ячейки(как в формуле) столбец А Пример: РР Республика Коми, г. Воркута, п. Цементнозаводский, ул. Ватутина, д. 21, кв. 22 База Воркута Северный Ватутина 21 22 Логика: город совпадает, посёлок нет, улица да, квартира да, кв да. почему именно так, потому что если в Базе я могу склеить как угодно. То в РР может не быть (ул. кв. п. птг) то есть все возможные написания типов П-птг-пос. это всё одно и тоже...и вариантов предусмотреть нереально......Если есть посёлок города может быть и не указано. Основной критерий сопоставления (улица, дом,) квартиры может не быть, например ИЖД(индивидульный жилой дом) г. Воркута, ул. Красных зорь, д. 3 Отвечу на возможный вопрос. Данная сверка проводится в пределах одного города. В связи с этим основной критерий (улица,дом). если бы сверка была массовая не в рамках одного города. обязательно было вы всё. Т.е. Берём строчку с листра РР Республика Коми, г. Воркута, п. Цементнозаводский, ул. Ватутина, д. 21, кв. 22 1)И ищем вхождение по очереди. С начало ищем вхождение Населённый пункт столбец С из листа дата, Цементнозаводский, Если в столбце С не "Воркута" подставляем значение "Воркута" + значение из столбце C. (МОЖЕТ ОТСУТСТВОВАТЬ) это или это(то что ниже) 2)Вхождение Воркута найдено. Цементнозаводский не найдено.(МОЖЕТ ОТСУТСТВОВАТЬ) 3)Ищем второе вхождение Улица т.е. ищем в строке РР, улицу из столбца D листа БАЗА, нашли. (ОБЯЗАТЕЛЬНО) 4)Ищем третье вхождение ДОМ (№ домов которые соответствуют этой улице с листа база) нашли.(ОБЯЗАТЕЛЬНО) 5)Ищем четвертое вхождение КВ (Список квартир которые соответствуют УЛИЦЕ И ДОМУ) (МОЖЕТ ОТСУТСТВОВАТЬ) Именно в таком порядке по причинам которые написанны выше. грубо говоря =ПОИСК("Ватутина";А1) потом после ватутина =ПОИСК("21";А1) и т.д. типо если находит значит 1 ИСТИНА, при 1 1 1, считаем что строка из БАЗЫ подходит к РР и копируем её рядом к строке РР.
Версия на гугл диске(больший объем чем в файле примере) но всё равно не такой какой будет. По факту будем иметь примерно 10 таких файлов по 100к строк.(сейчас на Воркуте, потом на остальных больших городах республики) Гугл диск
Алгоритм, я бы применил следующий. Забрал с листа "База" адреса в словарь, таблицу "РР" в массив, пробежал по массиву сверяя данные со словарем, если совпадает то прямо в текущий массив и перезаписывал, нужные столбцы, используя переменную счетчик. А затем кусок массива выгрузил на лист ограничив счетчиком который велся при совпадении по вертикали и количеством перезаписываемых столбцов по горизонтали. Сам код писать нет времени, поэтому пишу алгоритм. В принципе задача не сложная, да и на больших объемах должна работать быстрее 20 мин.
"Все гениальное просто, а все простое гениально!!!"
Nordheim, Спасибо интересное решение, но не совсем. Как я писал ранее не везде 100% совпадение в адресе. присутствуют нюансы)(описание под спойлером более подробно в #1) Провел тест на примере который на гугл диске. Из 30274 на листе РР. на лист "отчёт" попало только 16885 т.е. 100% совпадения, чуть больше 50%. Было бы сразу 100% совпадение) этой бы темы не было) Например: Республика Коми, г Воркута, пгт Северный, ул Ватутина, д 9, кв 71 Республика Коми, г Воркута, пгт Северный, ул Ватутина, д 9, кв. 71 Республика Коми, г Воркута, пгт Северный, ул. Ватутина, д 9, кв 71 Республика Коми, г Воркута, ул Ватутина, д 9, кв 71 г Воркута, пгт Северный, ул. Ватутина, д 9, кв 71 насколько я понимаю с точки зрения вашего кода, это всё разные адреса. но по факту это один адрес) В свою очередь хочу заметить что. ВСЕ адреса которые есть на листе РР присутствуют и на листе База а вот С листа БАЗА не все адреса есть на листе РР. т.к. выборка была как раз по списку базы, и некоторые данные по адресам из базы в РР отсутствовали.
Для такой БД нужен ключ, посмотрите в эту сторону, если будет ключ то и проблемы с неправильным заполнением адреса исчезнут, а так какой код не напиши быстро он не отработает, по крайней мере не на VBA Excel .
"Все гениальное просто, а все простое гениально!!!"
Wild.Godlike написал: это всё разные адреса. но по факту это один адрес
"Какие Ваши доказательства?" (с)тырено Вероятно, что это так, но ведь может улица с одинаковым названием присутствовать и в городе и в посёлке. Вообще, за такую "базу" руки отрывают, медленно, с наслаждением. Я бы для начала разобрал адреса по частям, на основе справочников. Тогда было бы ясно, что улицы Ватутина нет в Воркуте, значит адрес неверный и надо разгребать его руками.
Nordheim, Мартын, Товарищи ) Конкретно с моей базой, всё в порядке) и ключи и ИД и всё что нужно имеется. а вот с базой РР (Росреестр) всё не так радужно как хотелось бы) и если бы имелась возможность отрывать руки кадастровым инженерам я только за). Так что работать с РР приходится с тем что, имеем Так что в этом то и проблема) что надо притянуть данные с сайта РР к нам в базу)
Nordheim, К сожелению если даже у них и имеется, то сотрудничать они не хотят невкакую, 2 года писем и запросов, в ответ пользуйтесь нашими сервисами на сайте и API, тот API который у них имеется не позволяет получать данную информацию с нужных сервисов, а в ответ жди когда нибудь реализуем. слишком большая гос. машина чтобы с ними договорится) Инфа парсится из открытого источника ТЫЦ обход капчи и лалала) вставляем например 11:16:0701001:1000 в поле кадастровый номер, вводим капчу, найти, тыкаем на адрес, видим табличку с данными). ну и парсим в эксель) Причём как собираются данные (кадастровые номера) чтобы потом это подсунуть для этого сервиса в парсер(там только в ручную) ещё отдельная история). Я конечно могу всё рассписать. от и до) но это думаю врятли относится к теме) Из за всего этого и остаётся что использовать Fuzzy lookup, других методов не нашел. и врятли найду походу) Хотя думаю можно составить гиганское ТЗ от и до, но думаю разработка такого парсера выйдет в 20+к если не больше.
По какому алгоритму после парсинга сверять на идентичность это:
Цитата
Wild.Godlike написал: Республика Коми, г Воркута, пгт Северный, ул Ватутина, д 9, кв 71 Республика Коми, г Воркута, пгт Северный, ул Ватутина, д 9, кв. 71 Республика Коми, г Воркута, пгт Северный, ул. Ватутина, д 9, кв 71 Республика Коми, г Воркута, ул Ватутина, д 9, кв 71 г Воркута, пгт Северный, ул. Ватутина, д 9, кв 71
msi2102, Посмотрел, годно, чучуть подредактировать только, а потом уже черезе ctrl+H почему то даже не подумал в сторону регулярных.(подумал сразу что при объемах в 100к строк, с таким кол-вом формул excel не выживет вообще) Nordheim, В #1 под спойлером рассписано как я себе это представляю.)
Желательно и перед обработкой сделать ctrl+H на листе РР, заменить "район" - "р-н", "пгт" - "пгт." и т.д. Или в запрос добавлять все возможные варианты. И ещё если "пгт.", "пос." и "п." можно удалить (навряд ли будут одинаковые названия к примеру: пгт. Воргашор и село Воргашор), то обозначения "ул", "б-р", "просп." и т.п., я бы посоветовал оставить, т.к. может присутствовать и ул. Блюхера, и пер. Блюхера.
msi2102, Согласен) играюсь вот сейчас) ещё нашел что лучше сразу на листре РР заменить ", корп. " на /, чтобы было не 15, корп. 3, кв **, а 15\3 как в базе. не подумал сразу об этом. А какой UDF вы использовали для регулярок который идёт в PLEX работает с вашими Патернами, а который идёт из ПРИЁМОВ нет.
msi2102, По вашей ссылке там же вот это, только UDF не нашел там надстройки. я в #15 на неё ссылку и давал. что она у меня не работает ( Или вы про самый последний коммент внизу страницы? разобрался) Пошел играться дальше)
Wild.Godlike, в #16 есть прикрепленный файл RegExpExtract.xlam установите эту надстройку. Подключите библиотеку Microsoft VBScript Regular Expressions 5.5
И так) поюзал регулярки и Fuzzylookup. после регулярок и т.д. ещё надо обрабатывать в адекватный вид, много замен черезе CTRL+H и т.д.(думаю это от того что с регулярками до этого не работал, и приходилось юзать гугл ну и т.д. днище кароч я в этом), с fuzzy дольше но меньше действий руками). Думаю нужно усовершенствовать свои навыки)