Krótki brief pytań i decyzji, które trzeba podjąć na starcie
Zanim zaczniesz standaryzację nazw miast i ulic w Power Query, zatrzymaj się na chwilę przy kluczowych pytaniach. Od odpowiedzi zależy cały proces i uniknięcie późniejszych poprawek:
- Czy potrzebujesz jednej formy finalnej do prezentacji, czy dwóch kolumn: technicznej (do łączeń) i prezentacyjnej (do raportów)?
- Czy zachowujesz polskie znaki w wynikowej kolumnie, czy usuwasz je tylko w kolumnie technicznej do dopasowań?
- Jakie skróty typów ulic akceptujesz: „ul.”/„al.” czy pełne „Ulica”/„Aleja”? Jedna konsekwentna decyzja na całą bazę.
- Jak traktujesz wielkość liter: UPPER CASE, Proper Case (inicjały wielkie), czy oryginał po oczyszczeniu?
- Czy będziesz łączyć dane ze słownikiem referencyjnym (np. TERYT SIMC/ULIC)? Jeśli tak – jak konstruujesz klucze dopasowania?
- Jakie odstępstwa tolerujesz w fuzzy match: progi podobieństwa, dopuszczenie błędów w literach, ignorowanie znaków diakrytycznych?
- Jak rejestrujesz wyjątki: tabela „Do weryfikacji” czy automatyczne reguły naprawcze?
Najczęstsze błędy w praktyce i bezpieczne korekty
Błąd 1: Ukryte znaki i „dziwne” spacje zostawione bez czyszczenia
Dlaczego szkodzi: wizualnie tekst wygląda dobrze, ale dopasowania i grupowania nie działają. Powstają „duplikaty-widma”.
Jak to wychwycić:
- Filtrowanie po równości zwraca kilka wersji tej samej nazwy.
- Długość tekstu różni się mimo identycznego wyglądu („Kraków” vs „Kraków ”).
Jak zrobić lepiej:
- Transformuj kolejno: Formatuj → Oczyść (Text.Clean), potem Przytnij (Text.Trim), a następnie zamień wielokrotne spacje na pojedynczą (np. split po spacji i ponownie połącz).
- Ujednolić myślniki: zamień „–”/„—” na „-”, usuń spacje wokół wg jednej reguły (np. „Gdańsk-Śródmieście”).
Krótki przykład: „Poznań ” (NBSP) ≠ „Poznań”. Po oczyszczeniu i przycięciu znikają rozjazdy w łączeniach.

Błąd 2: Usuwanie polskich znaków w kolumnie prezentacyjnej
Dlaczego szkodzi: raporty wyglądają nieprofesjonalnie („Lodz”, „Zielona Gora”), a użytkownicy nie ufają danym.
Jak to wychwycić:
- Porównaj kolumnę raportową z oryginałem w kilku losowych rekordach.
Jak zrobić lepiej:
- Utrzymuj dwie kolumny: techniczną (bez diakrytyków do dopasowań) i prezentacyjną (z polskimi znakami). W Power Query użyj usuwania akcentów tylko w kolumnie klucza (np. Text.RemoveDiacritics).
- W kolumnie prezentacyjnej stosuj czyszczenie, ale bez pozbawiania diakrytyków.
Błąd 3: Skróty typów ulic bez spójnej mapy
Dlaczego szkodzi: „ul. Jana Pawła II”, „Ulica Jana Pawła II” i „ul Jana Pawła II” traktowane są jak różne wartości. Fuzzy match zaczyna łączyć błędnie lub nie łączy wcale.
Jak to wychwycić:
- Szybkie „Group By”/„Grupuj według” na kolumnie ulicy i policzenie wariantów skrótów na początku nazwy.
Jak zrobić lepiej:
- Opracuj słownik skrótów i form pełnych (np. „ul”, „ul.” → „ul.”; „al”, „al.” → „al.”; „plac”, „pl.” → „pl.”).
- Stosuj zamiany warunkowe na początku ciągu (Text.StartsWith) lub tokenizację pierwszego słowa, by nie zmieniać części wewnątrz nazwy („Most Poniatowskiego” nie powinien stać się „M.”).
- Przechowuj słownik w tabeli (Excel/SharePoint) i łącz (Merge) zamiast ręcznie „Zamień wartości”. Dzięki temu zmiany są centralne i wersjonowalne.
Krótki przykład: „al Jerozolimskie” → „al. Jerozolimskie”; „Plac Konstytucji” → „pl. Konstytucji”.
Błąd 4: Zła kolejność transformacji
Dlaczego szkodzi: zamiana skrótów po „Proper Case” bywa nieskuteczna („UL.” ≠ „Ul.”), a czyszczenie po dopasowaniach psuje już zbudowane klucze.
Jak to wychwycić:
- W Query Settings przejrzyj kroki: czy czyszczenie i normalizacja spacji są na początku, a tworzenie kluczy dopiero po ujednoliceniu treści?
Jak zrobić lepiej (proponowana sekwencja):
- 1) Clean → Trim → normalizacja spacji i myślników
- 2) Normalizacja skrótów (słownik)
- 3) Usunięcie dopisków dzielnic/osiedli, jeśli klucz ma dotyczyć tylko miasta/ulicy
- 4) Docelowa wielkość liter (Upper/Proper) dla prezentacji
- 5) Budowa kolumny klucza technicznego: bez diakrytyków, bez znaków specjalnych
Błąd 5: Ignorowanie łączników, nawiasów i dopisków dzielnic
Dlaczego szkodzi: „Kraków (Nowa Huta)” vs „Kraków” lub „Warszawa-Bielany” vs „Warszawa” – dopasowania do SIMC nie trafią.
Jak to wychwycić:
- Wyszukaj nawiasy „(” lub myślniki w kolumnie miasta, sprawdź udział procentowy.
Jak zrobić lepiej:
- Na potrzeby klucza miejskiego odetnij dopiski po „(” i po „-” tam, gdzie to ewidentnie dzielnice/dzielnice-stare. Zostaw pełną formę w kolumnie prezentacyjnej.
- Dla wyjątków (np. „Jastrzębie-Zdrój” – myślnik jest częścią nazwy) trzymaj białą listę wyjątków w osobnej tabeli i stosuj ją przed regułą odcinania.
Błąd 6: Fuzzy match bez ograniczeń i bez transformacji wstępnych
Dlaczego szkodzi: zbyt niski próg i brak transformacji powodują błędne łączenia („Sadowa” → „Sadowa Górna”).
Jak to wychwycić:
- Przegląd kolumny „similarity”/wyników scalania na próbce – szukaj oczywistych pomyłek.
Jak ustawić fuzzy match bezpiecznie
Jak zrobić lepiej:
- Najpierw normalizacja, potem fuzzy. Zrób klucze pomocnicze: bez diakrytyków (Text.RemoveDiacritics), bez znaków specjalnych (Text.Select z zestawem [a–z 0–9 i spacja]), bez podwójnych spacji.
- Łącz po kompozycie. Zbuduj klucz „Miasto|Ulica” zamiast samej ulicy. To drastycznie zmniejsza fałszywe trafienia (np. „Piłsudskiego” w wielu miastach).
- Ustaw próg podobieństwa rozsądnie: 0,9–0,92 dla ulic; 0,92–0,95 dla miast. Lepiej mieć więcej rekordów „Do weryfikacji” niż błędne sparowania.
- Włącz ignorowanie wielkości liter i spacji w ustawieniach fuzzy. Diakrytyki usuń wcześniej w kluczu technicznym, a nie w opcji łączenia.
- Użyj tabeli transformacji (synonimy/skróty) przed fuzzy: „al.”⇄„aleja”, „pl.”⇄„plac”, „św.”⇄„świętego”. Fuzzy nie jest słownikiem.
- Ogranicz liczbę dopasowań na wiersz i wybierz najbliższe (jeśli wersja pozwala). Potem filtruj wyniki po similarity ≥ progu kontrolnym.
Krótki przykład: klucz_tech = Proper(Clean(Trim(Text.RemoveDiacritics([Miasto]) & ” | ” & Text.RemoveDiacritics([Ulica])))); fuzzy na kluczu_tech z progiem 0,92 i tabelą skrótów.
Błąd 7: Łączenie ulic bez kontekstu miasta
Dlaczego szkodzi: „Kościuszki” czy „Słoneczna” występują w setkach miejscowości. Fuzzy po samej nazwie ulicy łączy rekordy z innym miastem.
Jak to wychwycić:
- Po scaleniu sprawdź udział wierszy z wieloma trafieniami oraz przykłady, gdzie miasto po lewej ≠ miasto po prawej.
Jak zrobić lepiej:
- Kompozyt: [województwo|powiat|gmina|miasto|ulica] lub minimum [miasto|ulica].
- Gdy masz TERYT SIMC: łącz najpierw miasto do SIMC, dopiero potem ulicę do ULIC w obrębie dopasowanego identyfikatora miejscowości.
Błąd 8: Zostawianie numerów domów w kolumnie ulicy
Dlaczego szkodzi: „ul. Słoneczna 12/4” nie dopasuje się do słownika ULIC (bez numeracji), a fuzzy doda chaos.
Jak to wychwycić:
- Wyszukaj wzorce cyfr na końcu ciągu: kończy się na [0–9] lub zawiera „/”.
Jak zrobić lepiej:
- Rozdziel: Ulica = do pierwszego wystąpienia numeru; Numer = reszta. W M: użyj skanu od końca i odetnij ciąg ostatnich tokenów cyfrowych wraz z „/”, „A”, „B”.
- Najpierw oczyść skróty i spacje, potem tnij. Przykład: „ul. Jana III Sobieskiego 3A” → Ulica: „ul. Jana III Sobieskiego”, Numer: „3A”.

Błąd 9: Agresywne wycinanie nawiasów i łączników
Dlaczego szkodzi: globalna reguła „po myślniku usuń wszystko” zniszczy poprawne nazwy („Jastrzębie-Zdrój”, „Kędzierzyn-Koźle”).
Jak to wychwycić:
- Lista miast z myślnikiem i udział rekordów, które po cięciu zmieniły długość ≥ 30%.
Jak zrobić lepiej:
- Biała lista wyjątków (miasta/ulice z myślnikiem jako częścią nazwy) stosowana przed regułą odcinania.
- Dla nawiasów – wycinaj tylko typowe dopiski dzielnic (np. „(Nowa Huta)”, „(Śródmieście)”) i tylko w kluczu technicznym. Kolumna prezentacyjna zostaje pełna.
Błąd 10: Romanizacja i numeracja mieszana w nazwach
Dlaczego szkodzi: „Jana Pawła II” vs „Jana Pawla 2” – bez normalizacji to dwie różne wartości.
Jak to wychwycić:
- Wyszukaj tokeny rzymskie (np. regex: b[IVXLCDM]{1,4}b) oraz odpowiadające im cyfry arabskie i porównaj wyniki „Group By”.
- Zrób kopię kolumny i zamień rzymskie na arabskie; porównaj liczbę unikatów przed vs po — duży spadek to sygnał rozjazdów.
- Wyłap mieszanki: „II” oraz „2” w tej samej grupie miasta/ulicy — to kandydaci do ujednolicenia.
Jak zrobić lepiej:
- Ustal zasadę: w kolumnie prezentacyjnej pozostaje rzymska („II”), w kolumnie klucza technicznego liczba arabska („2”).
- Zamieniaj tylko całe tokeny (po rozbiciu na słowa i znaki „.,-/”). Nie dotykaj części wyrazów.
- Przygotuj mapę I–XII → 1–12 (najczęstsze), przechowuj w tabeli i łącz po tokenie. Dalsze wartości według potrzeb.
- Po zamianach ponownie Clean/Trim i redukcja wielokrotnych spacji.
Krótki przykład: „ul. Jana Pawła II” → prezentacja: „ul. Jana Pawła II”; klucz_tech: „jana pawla 2”.
Błąd 11: Tytuły i stopnie bez standaryzacji w nazwach patronów
Dlaczego szkodzi: „św. Jana”, „sw Jana”, „świętego Jana” lub „gen. Andersa” vs „generała Andersa” — drobne różnice mnożą warianty i obniżają trafność dopasowań.
Jak to wychwycić:

- Group By na pierwszych 2–3 tokenach po typie ulicy i policz warianty „św/sw/świętego”, „gen./generała”, „ks./księdza”, „dr/prof”.
- Wyszukaj skróty z kropką i bez kropki (np. „ks”, „ks.”) oraz formy odmienione („generała”).
Jak zrobić lepiej:
- Stwórz słownik tytułów i stopni z formą docelową (np. „św.”, „gen.”, „ks.”, „mjr.”, „prof.”, „dr”).
- Normalizuj wyłącznie na granicach tokenów i poza pierwszym słowem typu ulicy, aby nie zmienić np. „Plac” → „pl.”, jeśli tego nie chcesz.
- W prezentacji dopuszczaj pełne formy, ale w kluczu technicznym trzymaj krótkie, spójne skróty (lub usuń je całkiem w kluczu).
Krótki przykład: „ul. świętego Jana” / „ul. św Jana” / „ul. św. Jana” → prezentacja: „ul. św. Jana”; klucz_tech: „sw jana”.
Błąd 12: Kody pocztowe i „Poczta/UP” w polu miasta
Dlaczego szkodzi: „Warszawa 02-326”, „Poznań UP Grunwald” — dopasowania do SIMC nie działają, a miasto staje się niespójne.
Jak to wychwycić:
- Filtr na wzorzec kodu: bd{2}-d{3}b oraz słowa kluczowe „UP”, „Poczta”.
- Sprawdź długość tekstu miasta po usunięciu kodu — gdy spada o ≥ 7 znaków, prawdopodobnie zawierał kod.
Jak zrobić lepiej:
- Wydziel nowe kolumny: „Kod pocztowy” i „Poczta”. Z miasta usuń te dopiski w kluczu technicznym.
- W prezentacji zachowaj „Miasto (kod)”, jeśli potrzebne odbiorcom, ale trzymaj czysty „Miasto” do dopasowań.
Błąd 13: Typ ulicy (ul./al./pl./os.) traktowany jak część nazwy
Dlaczego szkodzi: „Aleja Niepodległości” vs „al. Niepodległości” czy „Plac Zwycięstwa” vs „pl. Zwycięstwa” — różne formy jednego typu drogi rozbijają dopasowania i statystyki unikatów.
Jak to wychwycić:
- Group By po pierwszym tokenie i policz udział „ul/ul.”, „al/al.”, „pl/pl.”, „os/os.” itd.
- Lista ulic zaczynających się od 2–3 liter + kropka — typowy skrót typu drogi.
Jak zrobić lepiej:
- Wyodrębnij typ drogi do osobnej kolumny (np. „Typ drogi”), nazwę ulicy trzymaj bez typu. W prezentacji sklejaj z powrotem.
- Ujednolić skróty przez słownik: „ulica→ul.”, „aleja→al.”, „plac→pl.”, „osiedle→os.”, „rondo→ron.”, „skwer→skw.”.
- Normalizuj wyłącznie całe tokeny. Prosty zabieg: podziel tekst na słowa, przemapuj tokens, złóż ponownie.
Krótki przykład: „al. Jana Pawła II” / „Aleja Jana Pawła II” → Typ: „al.”; Ulica: „Jana Pawła II”.
Błąd 14: Mieszanie miejscowości nadrzędnej z częścią miejscowości
Dlaczego szkodzi: „Łódź-Bałuty”, „Wrocław Psie Pole” — SIMC rozróżnia miejscowości i ich części. Łączenie „miasto + dzielnica” jakby to było samo miasto prowadzi do błędów i podwójnych rekordów.
Jak to wychwycić:
- W lewym źródle wyszukaj myślniki/spacje po mieście, sprawdź kolumnę po prawej (SIMC) — czy typ jednostki to „część miasta/część wsi”.
- Zlicz przypadki, w których po usunięciu dopisku dzielnicy dopasowanie do SIMC nagle się udaje.
Jak zrobić lepiej:
- Dwuetapowo: (1) dopasuj „Miasto (SIMC miejscowości)”, (2) w obrębie tego SIMC dopasuj „Część miejscowości” (jeśli występuje) oraz ulicę (ULIC).
- Dzielnice/osiedla trzymaj w osobnej kolumnie. W kluczu technicznym miasta używaj wyłącznie nazwy miejscowości nadrzędnej.
- Biała lista miast o nazwach z myślnikiem jako integralną częścią (np. „Jastrzębie-Zdrój”) stosowana przed odcinaniem.
Błąd 15: Niewidzialne znaki: NBSP, tabulatory, znaki sterujące
Dlaczego szkodzi: „Gdańsk” i „Gdańsk ” wyglądają tak samo, ale nie łączą się. Fuzzy też może je przeskoczyć ponad progiem, lecz to ukryje realny problem jakości.
Jak to wychwycić:
- Filtr na długość: Text.Length([Miasto]) ≠ Text.Length(Text.Trim([Miasto])).
- Wyszukaj znak NBSP: Character.FromNumber(160) i inne białe znaki różne od spacji.
Jak zrobić lepiej:
- Zastąp NBSP zwykłą spacją przed Clean/Trim. Potem redukcja wielokrotnych spacji.
- Stosuj jedną funkcję oczyszczającą w kroku bazowym i nie powielaj jej w kolejnych kolumnach kluczy.
Krótki przykład (M):
let sp = Character.FromNumber(160) in Text.Replace(Text.Clean(Text.Trim([Miasto])), sp, " ")- Redukcja wielokrotnych spacji:
Text.Combine(List.Select(Text.SplitAny(_, " "), each _ <> ""), " ")






