Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Ako rýchlo a hromadne nahradiť text podľa referenčného zoznamu vzorcami – to sme už vyriešili. Teraz to skúsme urobiť v Power Query.

Ako sa často stáva vykonať táto úloha je oveľa jednoduchšia ako vysvetľovanie prečo ide to, ale skusme oboje 🙂

Máme teda dve „inteligentné“ dynamické tabuľky vytvorené z bežných rozsahov pomocou klávesovej skratky ctrl+T alebo tím Domov – Formátovať ako tabuľku (Domov – Formátovať ako tabuľku):

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Zavolal som na prvý stôl dátum, druhý stôl - adresárpomocou poľa Názov tabuľky (názov tabuľky) pútko staviteľ (Dizajn).

Úloha: nahraďte adresy v tabuľke dátum všetky výskyty zo stĺpca Nájsť Príručka na ich zodpovedajúce správne náprotivky zo stĺpca náhradka. Zvyšok textu v bunkách by mal zostať nedotknutý.

Krok 1. Načítajte adresár do Power Query a premeňte ho na zoznam

Po nastavení aktívnej bunky na ľubovoľné miesto v referenčnej tabuľke kliknite na kartu dátum (Dátum)alebo na karte mocenský dotaz (ak máte starú verziu Excelu a Power Query ste nainštalovali ako doplnok na samostatnej karte) na tlačidle Z tabuľky/rozsahu (Z tabuľky/rozsahu).

Referenčná tabuľka sa načíta do editora dotazov Power Query:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Aby neprekážalo, automaticky pridaný krok upravený typ (Zmenený typ) v pravom paneli je možné aplikované kroky bezpečne odstrániť, pričom zostane iba krok zdroj (Zdroj):

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Teraz, aby sme mohli vykonať ďalšie transformácie a nahradenia, musíme túto tabuľku zmeniť na zoznam (zoznam).

Lyrická odbočka

Skôr než budeme pokračovať, poďme najprv pochopiť pojmy. Power Query dokáže pracovať s niekoľkými typmi objektov:
  • Tabuľka je dvojrozmerné pole pozostávajúce z niekoľkých riadkov a stĺpcov.
  • Záznam (záznam) – jednorozmerné pole-reťazec, pozostávajúce z niekoľkých polí-prvkov s názvami, napr [Meno = "Masha", Pohlavie = "F", Vek = 25]
  • zoznam – jednorozmerné pole-stĺpec, pozostávajúce z niekoľkých prvkov, napr {1, 2, 3, 10, 42} or { "Viera nádej láska" }

Na vyriešenie nášho problému nás bude zaujímať predovšetkým typ zoznam.

Trik je v tom, že položky zoznamu v Power Query môžu byť nielen banálne čísla alebo text, ale aj iné zoznamy alebo záznamy. Práve v takom ošemetnom zozname (zozname), pozostávajúcom zo záznamov (záznamov), musíme náš adresár otočiť. V syntaktickej notácii Power Query (položky v hranatých zátvorkách, zoznamy v zložených zátvorkách) by to vyzeralo takto:

{

    [ Nájsť = „Sv. Petersburg“, Nahradiť = „St. Petersburg”] ,

    [ Nájsť = „Sv. Petersburg“, Nahradiť = „St. Petersburg”] ,

    [ Nájsť = „Peter“, Nahradiť = „Sv. Petersburg”] ,

a tak ďalej

}

Takáto transformácia sa vykonáva pomocou špeciálnej funkcie jazyka M zabudovaného do Power Query – Table.ToRecords. Ak ju chcete použiť priamo v riadku vzorcov, pridajte túto funkciu do kódu kroku tam zdroj.

To bolo:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Po:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Po pridaní funkcie Table.ToRecords sa vzhľad našej tabuľky zmení – zmení sa na zoznam záznamov. Obsah jednotlivých záznamov je možné zobraziť v spodnej časti tably zobrazenia kliknutím na pozadie bunky vedľa ľubovoľného slova Záznam (ale nie jedným slovom!)

Okrem vyššie uvedeného má zmysel pridať ešte jeden ťah – ukladať do vyrovnávacej pamäte (buffer) náš vytvorený zoznam. To prinúti Power Query načítať náš vyhľadávací zoznam raz do pamäte a nebude ho znova prepočítavať, keď k nemu neskôr pristúpime, aby sme ho nahradili. Ak to chcete urobiť, zabaľte náš vzorec do inej funkcie – List.Buffer:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Takéto ukladanie do vyrovnávacej pamäte poskytne veľmi výrazné zvýšenie rýchlosti (niekoľkonásobne!) s veľkým množstvom počiatočných údajov, ktoré sa majú vymazať.

Tým je príprava príručky ukončená.

Zostáva kliknúť ďalej Domov – Zavrieť a načítať – Zavrieť a načítať do… (Home — Close&Load — Close&Load to..), vyberte možnosť Stačí vytvoriť spojenie (Iba vytvoriť spojenie) a vráťte sa do Excelu.

Krok 2. Načítanie tabuľky údajov

Všetko je tu banálne. Rovnako ako predtým s referenčnou knihou sa dostaneme na ľubovoľné miesto v tabuľke, kliknite na kartu dátum gombík Z tabuľky/rozsahu a náš stôl dátum dostane do Power Query. Automaticky pridaný krok upravený typ (Zmenený typ) môžete tiež odstrániť:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Netreba s tým robiť žiadne špeciálne prípravné akcie a prejdeme k tomu najdôležitejšiemu.

Krok 3. Vykonajte výmeny pomocou funkcie List.Accumulate

Pridajme vypočítaný stĺpec do našej tabuľky údajov pomocou príkazu Pridanie stĺpca – vlastný stĺpec (Pridať stĺpec – vlastný stĺpec): a v okne, ktoré sa otvorí, zadajte názov pridaného stĺpca (napr. opravená adresa) a naša magická funkcia Zoznam.Akumulovať:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Zostáva kliknúť ďalej OK – a dostaneme stĺpec s vykonanými náhradami:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Poznač si to:

  • Keďže Power Query rozlišuje veľké a malé písmená, v predposlednom riadku nedošlo k žiadnej náhrade, pretože v adresári máme „SPb“, nie „SPb“.
  • Ak je v zdrojových údajoch nahradených niekoľko podreťazcov naraz (napríklad v 7. riadku je potrebné nahradiť „S-Pb“ aj „Prospekt“), nespôsobuje to žiadne problémy (na rozdiel od nahradenia vzorcami z predchádzajúca metóda).
  • Ak v zdrojovom texte nie je čo nahradiť (9. riadok), nevyskytujú sa žiadne chyby (opäť na rozdiel od nahradenia vzorcami).

Rýchlosť takejto požiadavky je veľmi, veľmi slušná. Napríklad pre tabuľku počiatočných údajov s veľkosťou 5000 3 riadkov bol tento dotaz aktualizovaný za menej ako sekundu (mimochodom bez ukladania do vyrovnávacej pamäte, asi XNUMX sekundy!)

Ako funguje funkcia List.Accumulate

V zásade by to mohol byť koniec (pre mňa na písanie a pre vás na čítanie) tohto článku. Ak chcete nielen vedieť, ale aj pochopiť, ako to funguje „pod kapotou“, budete sa musieť ponoriť trochu hlbšie do králičej nory a vysporiadať sa s funkciou List.Accumulate, ktorá urobila všetku hromadnú výmenu pracovať pre nás.

Syntax tejto funkcie je:

=List.Accumulate(zoznam, semienko, akumulátor)

kde

  • zoznam je zoznam, ktorého prvky opakujeme. 
  • semienko - počiatočný stav
  • akumulátor – funkcia, ktorá vykoná nejakú operáciu (matematickú, textovú atď.) na ďalšom prvku zoznamu a výsledok spracovania akumuluje do špeciálnej premennej.

Vo všeobecnosti syntax na zapisovanie funkcií v Power Query vyzerá takto:

(argument1, argument2, … argumentN) => niektoré akcie s argumentmi

Napríklad súčtová funkcia môže byť reprezentovaná ako:

(a, b) => a + b

Pre List.Accumulate má táto akumulačná funkcia dva povinné argumenty (možno ich pomenovať akokoľvek, ale bežné názvy sú stať и prúd, ako v oficiálnom pomocníkovi pre túto funkciu, kde:

  • stať – premenná, v ktorej sa kumuluje výsledok (jej počiatočná hodnota je tá, ktorá je uvedená vyššie semienko)
  • prúd – ďalšia iterovaná hodnota zo zoznamu zoznam

Pozrime sa napríklad na kroky logiky nasledujúcej konštrukcie:

=List.Accumulate({3, 2, 5}, 10, (stav, prúd) => stav + prúd)

  1. Variabilná hodnota stať je nastavený na rovnakú hodnotu ako počiatočný argument semienkoIe stav = 10
  2. Vezmeme prvý prvok zoznamu (prúd = 3) a pridajte ho do premennej stať (desať). Dostaneme stav = 13.
  3. Vezmeme druhý prvok zoznamu (prúd = 2) a pripočítať ju k aktuálnej akumulovanej hodnote v premennej stať (desať). Dostaneme stav = 15.
  4. Vezmeme si tretí prvok zoznamu (prúd = 5) a pripočítať ju k aktuálnej akumulovanej hodnote v premennej stať (desať). Dostaneme stav = 20.

Toto je najnovšie nahromadené stať hodnota je náš zoznam. Akumulovať funkciu a výstupy ako výsledok:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Ak trochu fantazírujete, potom pomocou funkcie List.Accumulate môžete simulovať napríklad funkciu Excel CONCATENATE (v Power Query je jej analóg tzv. Text.Combine) pomocou výrazu:

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Alebo dokonca vyhľadajte maximálnu hodnotu (imitácia funkcie MAX v Exceli, ktorá sa v Power Query nazýva Zoznam.Max):

Hromadné nahradenie textu v Power Query pomocou funkcie List.Accumulate

Hlavnou vlastnosťou List.Accumulate je však schopnosť spracovať ako argumenty nielen jednoduché textové alebo číselné zoznamy, ale aj zložitejšie objekty – napríklad zoznamy zo zoznamov alebo zoznamy zo záznamov (ahoj, Directory!)

Pozrime sa znova na konštrukciu, ktorá vykonala výmenu v našom probléme:

List.Accumulate(adresár, [Adresa], (stav,aktuálny) => Text.Nahradiť(stav, aktuálny[Nájsť], aktuálny[Nahradiť]) )

Čo sa tu vlastne deje?

  1. Ako počiatočná hodnota (semienko) vezmeme prvý nemotorný text zo stĺpca [Adresa] náš stôl: 199034, Petrohrad, str. Beringa, r. 1
  2. Potom List.Accumulate iteruje prvky zoznamu jeden po druhom – Príručka. Každý prvok tohto zoznamu je záznam pozostávajúci z dvojice polí „Čo nájsť – čím nahradiť“ alebo inými slovami, ďalší riadok v adresári.
  3. Funkcia akumulátora vkladá do premennej stať počiatočná hodnota (prvá adresa 199034, Petrohrad, str. Beringa, r. 1) a vykonáva na ňom funkciu akumulátora – operáciu výmeny pomocou štandardnej M-funkcie Text.Nahradiť (analogicky k funkcii SUBSTITUTE v Exceli). Jeho syntax je:

    Text.Nahradiť( pôvodný text, čo hľadáme, čím nahrádzame )

    a tu máme:

    • stať je naša špinavá adresa, ktorá leží v stať (dostať sa odtiaľ semienko)
    • aktuálne[Hľadať] – hodnota poľa Nájsť od nasledujúceho opakovaného záznamu zoznamu adresár, ktorá leží v premennej prúd
    • aktuálne[Nahradiť] – hodnota poľa náhradka od nasledujúceho opakovaného záznamu zoznamu adresárležať v prúd

Pre každú adresu sa teda zakaždým spustí celý cyklus enumerácie všetkých riadkov v adresári, pričom sa text z poľa [Nájsť] nahradí hodnotou z poľa [Nahradiť].

Dúfam, že máte nápad 🙂

  • Hromadné nahradenie textu v zozname pomocou vzorcov
  • Regulárne výrazy (RegExp) v Power Query

Nechaj odpoveď