Zoznamy v Power Query - ako, kedy a prečo SAMOSPRÁVA-BI BLOG

Jazyk M má takzvané štruktúrované hodnoty, ku ktorým patria zoznamy, záznamy a tabuľky. Každý typ hodnoty slúži na konkrétne účely a účelom tohto príspevku je predstaviť zoznamy. Tento príspevok je súčasťou série o zoznamoch, záznamoch a tabuľkách v jazyku M. Do tohto príspevku som zahrnul niekoľko snímok obrazovky s kódom M. Tu si môžete stiahnuť kód zo snímok obrazovky ako súbor txt. Na stiahnutie nie je potrebné heslo. Ak sa stále zobrazuje výzva na zadanie hesla pre OneDrive, zmeňte prehľadávač na Edge.

V M existujú dva druhy hodnôt: primitívne a štruktúrované hodnoty. Príklady primitívnych hodnôt sú:

  • „A“,
  • 1,
  • pravda.

Sú tak primitívni, že nie sú koncipovaní z iných hodnôt. Na rozdiel od primitívnych hodnôt máme v M takzvané štruktúrované hodnoty, ktoré sú zložené z ďalších hodnôt, primitívnych a štruktúrovaných. Zoznam je jednou z týchto štruktúrovaných hodnôt (ostatné sú záznamy a tabuľky) a je opísaný ako „usporiadaná postupnosť hodnôt“. Definovaný zoznam sa zavedie s úvodnou zloženou zátvorkou. Aj keď zoznamy môže byť prázdny (vyzerá to ako „<>“), zoznamy sú nie je obmedzený veľkosťou, pretože M podporuje nekonečne veľké zoznamy.

Príklad veľmi jednoduchého zástupcu zoznamu je:

Predtým, ako sa podrobnejšie pozrieme na zoznamy toho, čo sú a na čo slúžia, poďme si povedať, prečo vôbec používať zoznamy.

V prevažnej väčšine prípadov sa zoznam použije ako medziprodukt pre ďalšie dotazy. V každom prípade je extrémne zriedkavé, aby sa zoznam načítal do dátového modelu.

Je veľa domácich funkcie v M, ktoré poskytujú užitočné funkcie a očakávajte zoznamy ako jeden alebo viac z nich parametre. V týchto prípadoch je dôležité vedieť, ako vytvárať zoznamy, aby ste týmto funkciám mohli správne poskytnúť potrebné parametre.

Okrem toho je ich veľa funkcie v M že návratové zoznamy ako návratové hodnoty. Z týchto dôvodov je potrebné vedieť, ako s nimi zaobchádzať, aby sa jazyk M používal bezpečne.

Poďme sa pozrieť na to, ako vytvárať zoznamy.

Zoznam v M má zvyčajne začiatok a koniec a podľa mojich skúseností existuje 3 spôsoby v M vytvoriť zoznam:

1. Použitie syntaxe inicializácie zoznamu so zloženými zátvorkami

Zoznam môžete definovať pomocou otváracej zloženej zátvorky „item-list a ukončiť ju uzatváracou zloženou zátvorkou„> “. Najjednoduchší zoznam je prázdny zoznam.

Prázdne zoznamy

The prázdny zoznam je najjednoduchší zo všetkých zoznamov, v ktorom je zoznam položiek prázdny:

Praktickým prípadom použitia prázdneho zoznamu je napríklad vytvorenie tabuľky v dátovom modeli Power BI, ktorá obsahuje iba miery. Na rozdiel od prázdnej tabuľky vytvorenej v Power Query (ktorú môžete vytvoriť takto: = #table (<>, <>)), ktorá sa v dátovom modeli jednoducho neobjaví. prázdny zoznam sa importuje ako tabuľka do dátového modelu s jedným stĺpcom a bez riadkov. Výsledný stĺpec jednoducho skryte v dátovom modeli a túto prázdnu tabuľku použite ako tabuľku mier.

query
Vytvorenie tabuľky mier pomocou prázdneho zoznamu v M.

Prázdny zoznam je samozrejme skôr špeciálnym prípadom, pretože zoznamy zvyčajne obsahujú hodnoty, takzvané položky.

Zoznamy s položkami oddelenými čiarkou

Ak chcete vytvoriť neprázdny zoznam, môžem do zoznamu pridať hodnoty ľubovoľného typu oddelené čiarkou:

Ručné vytvorenie neprázdneho zoznamu

Ak chcem do zoznamu pridať veľké množstvo súvislých hodnôt, definícia oddelená čiarkami je dosť zložitá. Na to však existuje pomoc ...

Zoznamy so súvislými číslami

Napríklad, ak chcem vytvoriť zoznam, ktorý zobrazuje celý čísla od 1 do 100, Všetky tieto čísla nemusím ručne pridávať do zoznamu. Namiesto toho existuje nasledujúcou skratkou:

Ak by som napríklad chcel, aby boli uvedené celé čísla od 1 do 100, ale číslo 48 by mala byť vylúčené, potom to funguje nasledovne:

Takáto postupnosť súvislých hodnôt nesmie mať viac ako 2 ^ 31 (2.147.483.647) hodnôt. Napríklad si pozrite nasledujúcu definíciu zoznamu:

Vzhľadom na skutočnosť, že sa tu odkazuje na rozsah čísel väčší ako 2 147 483 647, vráti sa nasledujúce chybové hlásenie:

Susediace čísla nesmú byť nekonečne veľké

To však neznamená, že samotný zoznam nemusí obsahovať viac položiek, pretože ako už bolo spomenuté, zoznamy môžu byť nekonečne veľké. Nasledujúca definícia vráti platný výsledok:

Možno použiť aj syntax „.“ pre súvislý rozsah celých čísel znakov.

Zoznamy so súvislými znakmi

Postup, ktorý som práve ukázal pre postupné čísla, je možný aj pre písmená a znaky. Je napríklad platné definovať nasledujúci zoznam:

Výsledok potom vyzerá nasledovne:

Nemusí byť prekvapujúce, že Power Query „vie“, že po „a“ prichádza „b“, ale pozrite sa na zoznam a jeho výsledok:

Medzi písmenami „Z“ a „a“ je tiež niekoľko špeciálne znaky. Aký je teda základ tohto zoznamu a jeho zoradenia?

Zoznamy znakov sú založené na kódovaní Unicode

Funkcia M Character.ToNumber () odhaľuje tajomstvo:

Zoznamy znakov sú založené na kódovaní Unicode

Zoznamy znakov používajúcich znak „.“ - syntax vnútorne použitie the Unicode definícia definovať znaky aj ich poradie. Zoznam je teda interne prevedený na a nakoniec na zoznam znakov unicode. Ak chcete vidieť zodpovedajúci znak Unicode pre špeciálnu číselnú hodnotu, môžete použiť funkciu Charater.FromNumber (). Napríklad Character.FromNumber (91) má za následok „[“ .

Táto usporiadaná postupnosť znakov unicode je dôvodom, prečo sa vytvorí prázdny zoznam: Zoznam sa interne prevedie na jeho číselné hodnoty, čo v tomto prípade znamená. Pretože začiatok definovaného zoznamu je pred koncom zoznamu, výsledkom je prázdny zoznam.

Ručné definovanie zoznamov je jedným zo spôsobov. Pozrime sa, ako na to vytvárať zoznamy pomocou zodpovedajúce funkcie.

2. Pomocou natívnych M funkcií, ktoré vytvárajú zoznamy

V čase písania tohto článku máme 63 funkcií v M ktoré vrátia zoznam. Najviditeľnejšie z nich sú zoznam. * Funkcie (ale nie všetky vytvárajú zoznamy). Populárne príklady sú:

Ľahko identifikovateľné sú tiež prevodné funkcie * .ToList () (o ktorých sa budem podrobnejšie rozprávať neskôr), ako napríklad:

Všetky tieto funkcie vytvárajú zoznamy na základe vstupných parametrov. Existuje však aj iný spôsob, ako vytvoriť zoznam.

3. Odkaz na stĺpec/pole v tabuľke

Tretím spôsobom, ako vytvoriť zoznam, je odkazovať na stĺpec tabuľky pomocou nasledujúcej syntaxe: Tabuľka [Názov stĺpca]:

Vytvorenie zoznamu odkazom na stĺpec v tabuľke

Pretože to nemusí byť zrejmé, spomeniem tu, že odkaz na názov kroku (ak vráti tabuľku) má rovnaký účinok ako odkaz na výraz v tabuľke: # "názov kroku" [stĺpec] .

Teraz, keď vieme, čo sú zoznamy a ako sa vytvárajú, sa zameriame na prácu so zoznamami.

existujú 3 operátori ktoré možno použiť v spojení so zoznamami: „=“ a „<>“ umožňujú porovnávať zoznamy, zatiaľ čo „&“ kombinuje zoznamy. Tu je niekoľko príkladov, ako to využiť:

  1. =→ pravda
  2. <>→ pravda
  3. →. To sa dá dosiahnuť aj pomocou funkcie List.Combine (<, >)

Ďalším aspektom, ktorý je zaujímavý, pokiaľ ide o zoznamy, je spôsob, ako prístup k položkám v zozname.

Ak už máte zoznam, je niekedy potrebné priamo pristupovať k špeciálnym položkám v zozname.

Pomocou operátora pozičného indexu <>

Na prístup k položke v zozname môžete použiť tzv. operátor pozičného indexu "<>" Podľa číselného indexu. The položiek v zozname sa odkazuje na používanie a index založený na nule. Nasledujúce príklady to podrobne vysvetľujú:

Vezmite si nasledujúci zoznam: MyList =. Pretože interný index položiek zoznamu začína nulou, mám nasledujúce výsledky:

Zoznam MyList vedie k nasledujúcemu chybovému hláseniu, ktoré hovorí, že došlo k pokusu o prístup k položke zoznamu, ktorá v zozname neexistuje:

Na prekonanie tejto poslednej chybovej správy môžete použiť takzvaný nepovinný výber položiek nasledujúcim spôsobom, ktorý vráti hodnotu null, ak vybratá položka neexistuje:

Môj zoznam ? nula

Ak chcete zistiť, koľko položiek je v zozname, môžete použiť funkciu List.Count (). List.Count (MyList) vedie k výsledku 3, takže posledná položka v zozname má index 2 (List.Count (MyList) -1), pretože index je založený na nule.

Okrem vyššie uvedených príkladov existujú aj rôzne natívne funkcie M, ktoré umožňujú prístup k položkám v zozname.

Používanie natívnych M funkcií

Knižnica M ponúka širokú škálu funkcií zoznamu, z ktorých niektoré poskytujú prístup k položkám zoznamu. V nasledujúcich príkladoch vezmite tento zoznam: MyList =

Zoznam. Prvý ()

Táto funkcia pristupuje k prvej položke v zozname, čo je ekvivalentné použitiu operátora pozičného indexu s indexom 0 (napríklad MyList).

List.FirstN ()

Táto funkcia funguje dvoma spôsobmi.

  1. Ak druhý parameter funkcie je a číslo, prvé položky zoznamu sa vrátia až k tomuto číslu: List.FirstN (MyList, 2) =
  2. Ak druhý parameter funkcie je a stav, všetky tieto položky sa vrátia, kým sa podmienka prestane uplatňovať prvýkrát: List.FirstN (MyList, each _

List.Last ()

Táto funkcia sprístupní poslednú položku v zozname. Nasledujúce dva výrazy sú identické: List.Last (MyList) = MyList

List.LastN ()

Funguje ako List.FirstN, ale naopak.

List.Range ()

Vráti počet položiek začínajúcich na posunutí. List.Range (MyList, 2, 3) vedie k nasledujúcemu výsledku:

Zoznam. Vyberte ()

Táto funkcia určuje položky zoznamu nie na základe ich polohy v zozname, ale na základe určitých podmienok, ktoré musí táto položka spĺňať. Nasledujúci príklad prechádza zoznamom a vyberá tie položky, ktorých hodnota je väčšia ako 2:

Zoznam. Vyberte položku (MyList, každý _> 2), ktorá ako výsledok vráti nasledujúci zoznam:

Niekedy chcete použiť určitú funkcionalitu v M a hľadať vhodnú funkciu. Ak napríklad chcem premenujte názov stĺpca tabuľky s dynamicky spochybňujúcimi názvami stĺpcov, môžem to urobiť v M pomocou funkcie Table.RenameColumns (). Ak ignorujem posledný voliteľný parameter funkcie, potom je možné jej štruktúru opísať takto:

Table.RenameColumns (tabuľky s názvami stĺpcov, ktoré sa majú zmeniť, zoznam so štruktúrou)

Nasledujúca snímka obrazovky zobrazuje skript M, ktorý premenuje dva existujúce stĺpce tabuľky a je pripravený na zmenu titulkov stĺpcov pôvodnej tabuľky počas nasledujúceho spustenia. Samotné premenovanie titulkov stĺpcov sa uskutoční v poslednom riadku výrazu let (2). Všetky kroky popísané v červenom poli (1) sa používajú na vytvorenie dynamického zoznamu párov starých mien a nových mien požadovaného funkciou Table.RenameColumns ().

Premenovanie dynamicky sa meniacich názvov stĺpcov

Pozrime sa ďalej na funkcie, ktoré generujú zoznamy.

Mnoho funkcií v M generuje zoznamy a najjasnejšie z nich sú funkcie *. ToList:

*. Funkcie ToList

Binary.ToList () - vytvorí zoznam z binárnych súborov.

Record.ToList () - prevedie záznam na zoznam obsahujúci hodnoty poľa záznamu.

Príklad Record.ToList ()

Table.ToList () - Vytvorí zoznam z tabuľky oddelením riadkov po riadkoch oddeľovačom, ktorý je možné definovať vo voliteľnom parametri kombinátora (napr. Combiner.CombineTextByDelimiter (","))

Príklad Table.ToList ()

Text.ToList () - Vytvorí zoznam z textu pridaním každého znaku jednotlivo ako položky zoznamu.

Príklad Text.ToList ()

Funkcie *. ToList však nie sú jedinými funkciami, ktoré generujú zoznam z hodnoty určitého typu.

Ďalšie funkcie, ktoré vytvárajú zoznamy

Názov niektorých funkcií nenaznačuje, že vytvárajú zoznamy. Príkladom toho je funkcia Text.Split (). Predstavte si nasledujúca úloha: V dlhom texte spočítajte počet samostatných slov. Nasledujúci skript to robí pomocou Text.Split () v kombinácii s ďalšími funkciami zoznamu.

Používanie funkcie Text.Split () na počítanie (odlišných) slov

Ďalšie príklady funkcií, ktoré vracajú zoznamy, ale neznejú takto:

Aj keď je o zoznamoch a ich schopnostiach možné povedať ešte oveľa viac, myslím, že sa určite ukázalo, že zoznamy majú svoje čaro a že je potrebné s nimi pracovať, aby sme zvládli jazyk M.

Zdravím z Nemecka,

Lars je konzultant, vývojár a tréner pre Microsoft Power BI. Je certifikovaným expertom na Power BI a trénerom spoločnosti Microsoft. Za svoju angažovanosť v medzinárodnom spoločenstve dostal Lars od roku 2017 každoročne spoločnosť Microsoft cenu MVP. Viac sa dočítate tu ...