Limbajul M are așa-numitele valori structurate, cărora le aparțin listele, înregistrările și tabelele. Fiecare tip de valoare are scopuri specifice, iar această postare este destinată să ofere o introducere a listelor. Această postare face parte dintr-o serie despre liste, înregistrări și tabele din M. Am inclus câteva capturi de ecran cu codul M în această postare. Puteți descărca codul din capturile de ecran ca fișier txt aici. Descărcarea nu necesită o parolă. Dacă totuși vi se solicită parola OneDrive, schimbați browserul la Edge.

În M există două tipuri de valori: valorile primitive și structurate. Exemple pentru valorile primitive sunt:

  • "A",
  • 1,
  • Adevărat.

Ele sunt primitive în acest fel, încât nu sunt construite din alte valori. Spre deosebire de valorile primitive, am numit valori structurate în M, care sunt compuse din alte valori, primitive și structurate. O listă este una dintre acele valori structurate (celelalte sunt înregistrări și tabele) și este descrisă ca „o succesiune ordonată de valori”. O listă definită este introdusă cu o paranteză cu deschidere ". Chiar dacă liste poate fi gol (se pare că acest „<>”), listele sunt nu este limitat ca mărime, deoarece M acceptă liste infinit de mari.

Un exemplu de reprezentant foarte simplu al unei liste este:

Înainte de a arunca o privire mai detaliată asupra listelor cu ce sunt și la ce servesc, să discutăm de ce să folosim deloc listele.

În marea majoritate a cazurilor, o listă va fi utilizată ca produs intermediar pentru alte interogări. În orice caz, este extrem de rar ca o listă să fie încărcată în modelul de date.

Sunt mulți nativi funcții în M care oferă funcționalități utile și așteptați liste ca unul sau mai mulți dintre ei parametrii. Pentru aceste cazuri este important să știți cum să creați liste, astfel încât să puteți furniza acele funcții cu parametrii necesari într-un mod adecvat.

În plus, sunt multe funcții in m care returnează listele ca valori returnate. Din aceste motive, este necesar să știm cum să le abordăm pentru a utiliza limba M în siguranță.

Să aruncăm o privire asupra modului de creare a listelor.

O listă în M are de obicei un început și un sfârșit și, din experiența mea, există 3 căi in m pentru a crea o listă:

1. Utilizarea sintaxei de inițializare a listei cu acolade

Puteți defini o listă utilizând o paranteză buclă de deschidere „item-list” și o puteți încheia cu o paranteză buclă de închidere „>”. Cea mai simplă listă este o listă goală.

Liste goale

lista goală este cea mai simplă dintre toate listele, în care lista de articole este goală:

Un caz practic de utilizare a unei liste goale este, de exemplu, crearea unui tabel în modelul de date Power BI care conține doar măsuri. Spre deosebire de un tabel gol creat în Power Query (pe care îl puteți crea astfel: = #table (<>, <>)), care pur și simplu nu apare în modelul de date, un lista goală este importată ca tabel în modelul de date cu o coloană și fără rânduri. Pur și simplu ascundeți coloana rezultată în modelul de date și utilizați acest tabel gol ca tabel de măsuri.

când
Crearea unui tabel de măsuri, folosind o listă goală în M

O listă goală este, desigur, mai degrabă un caz special, deoarece listele conțin în mod normal valori, așa-numitele elemente.

Liste cu elemente separate prin virgulă

Pentru a crea un ne-gol listă, pot adăuga valori separate prin virgulă de orice tip la listă după cum urmează:

Crearea manuală a unei liste ne-goale

Dacă vreau să adaug un număr mare de valori contigue la o listă, definiția separată prin virgulă este destul de complexă. Dar există ajutor pentru asta ...

Liste cu numere contigue

De exemplu, dacă vreau să creez o listă care să afișeze întreg numere de la 1 la 100, Nu trebuie să adaug manual toate aceste numere pe listă. În schimb există urmând abrevierea:

Dacă, de exemplu, aș dori ca numerele întregi să fie listate de la 1 la 100, cu exceptia numărul 48 ar trebui să fie exclus, atunci acest lucru funcționează după cum urmează:

O astfel de succesiune de valori contigue nu trebuie să aibă mai mult de 2 ^ 31 (2.147.483.647) valori. De exemplu, priviți următoarea definiție a listei:

Datorită faptului că aici se face referire la o serie de numere mai mari de 2.147.483.647, se returnează următorul mesaj de eroare:

Numerele adiacente nu trebuie să fie pe termen nelimitat

Cu toate acestea, acest lucru nu înseamnă că lista în sine poate să nu aibă mai multe articole, deoarece așa cum am menționat deja, listele pot fi infinit de mari. Următoarea definiție returnează un rezultat valid:

Sintaxa „.” pentru un interval contiguu de numere întregi poate fi de asemenea aplicată personaje.

Liste cu caractere alăturate

Procedura pe care tocmai am arătat-o ​​pentru numerele consecutive este posibilă și pentru litere și caractere. De exemplu, este valid să se definească următoarea listă:

Rezultatul arată astfel:

Este posibil să nu fie surprinzător faptul că Power Query „știe” că după „a” apare „b”, dar uită-te la listă și la rezultatul acesteia:

Între literele „Z” și „a” există și un număr de personaje speciale. Deci, care este baza acestei liste și este un fel de ordine?

Listele de caractere se bazează pe Unicode

Funcția M Character.ToNumber () dezvăluie secretul:

Listele de caractere se bazează pe Unicode

Listele de caractere care utilizează „.” - sintaxă intern utilizare Unicode definiție pentru a defini atât personajele, cât și ordinea lor. Deci, lista este convertită intern și, în cele din urmă, într-o listă de caractere unicode. Dacă doriți să vedeți caracterul Unicode corespunzător pentru o valoare numerică specială, puteți utiliza funcția Charater.FromNumber (). De exemplu, Character.FromNumber (91) are ca rezultat „[” .

Această secvență ordonată de caractere unicode este motivul pentru care produce o listă goală: lista este convertită intern la valorile sale numerice, ceea ce înseamnă în acest caz. Deoarece începutul listei definite este înainte de sfârșitul listei, rezultatul este o listă goală.

Definirea manuală a listelor este o modalitate. Să vedem cum creați liste cu corespunzător funcții.

2. Folosind funcții native M, care creează liste

La momentul scrierii, avem 63 funcții in m care returnează o listă. Cele mai evidente dintre ele sunt Lista. * Funcțiile (dar nu toate creează liste). Exemple populare sunt:

De asemenea, ușor de identificat sunt funcțiile de conversie * .ToList () (pe care le voi discuta mai detaliat mai târziu), cum ar fi:

Toate aceste funcții creează liste pe baza parametrilor de intrare. Dar există o altă modalitate de a crea o listă.

3. Referindu-se la o coloană/câmp dintr-un tabel

A treia modalitate de a crea o listă este să faceți referire la o coloană a unui tabel utilizând următoarea sintaxă: Tabelul [Numele coloanei]:

Crearea unei liste, făcând referire la o coloană dintr-un tabel

Deoarece acest lucru poate să nu fie evident, voi menționa aici că referință la un nume de pas (dacă returnează un tabel) are același efect ca și referința la o expresie de tabel: # "numele pasului" [Coloană] .

Acum, că știm ce sunt listele și cum sunt create, ne vom concentra pe tratarea listelor.

Sunt 3 operatori care poate fi utilizat împreună cu liste: "=" și "<>" fac posibilă compararea listelor, în timp ce "&" combină listele. Iată câteva exemple de utilizare:

  1. =→ adevărat
  2. <>→ adevărat
  3. &→. Acest lucru poate fi realizat și prin utilizarea funcției List.Combine (<, >)

Un alt aspect interesant în ceea ce privește listele este cum să accesați elementele dintr-o listă.

Odată ce aveți o listă, este uneori necesar să accesați direct elementele speciale din listă.

Folosind operatorul de index pozițional <>

Pentru a accesa un element dintr-o listă, puteți utiliza - așa-numitul - operator index pozițional „<>” După indexul său numeric. elemente dintr-o listă se referă la utilizarea unui index bazat pe zero. Următoarele exemple explică acest lucru în detaliu:

Luați următoarea listă: MyList =. Deoarece indexul intern al articolelor listei începe cu zero, obțin următoarele rezultate:

MyList duce la următorul mesaj de eroare, spunând că se face o încercare de a accesa un element din listă care nu există în listă:

Pentru a depăși acest ultim mesaj de eroare, puteți utiliza așa-numitul optional-item-selection, după cum urmează, care returnează nul, dacă elementul selectat nu există:

Lista mea ? nul

Pentru a afla câte articole sunt într-o listă, puteți utiliza funcția List.Count (). List.Count (MyList) duce la rezultatul 3, deci ultimul element din listă are indexul 2 (List.Count (Lista mea) -1), deoarece indexul este zero.

În plus față de exemplele prezentate mai sus, există și diverse funcții native M care permit accesul la elemente dintr-o listă.

Folosirea funcțiilor native M.

Biblioteca M oferă o gamă largă de funcții de listă, dintre care unele oferă acces la elementele listei. Pentru următoarele exemple, luați această listă ca dată: MyList =

List.First ()

Această funcție accesează primul element dintr-o listă, care este echivalent cu utilizarea operatorului de index pozițional cu index 0 (cum ar fi MyList).

List.FirstN ()

Această funcție funcționează în două moduri.

  1. Dacă al doilea parametru a funcției este a număr, primele elemente de listă sunt returnate până la acest număr: List.FirstN (MyList, 2) =
  2. Dacă al doilea parametru de funtion este un condiție, toate acele articole sunt returnate până când condiția nu se mai aplică pentru prima dată: List.FirstN (MyList, fiecare _

List.Last ()

Această funcție accesează ultimul element dintr-o listă. Următoarele două expresii sunt identice: List.Last (MyList) = Lista mea

List.LastN ()

Funcționează ca List.FirstN, dar invers.

List.Range ()

Returnează un număr de articole începând cu un offset. List.Range (MyList, 2, 3) duce la următorul rezultat:

List.Select ()

Această funcție determină elementele dintr-o listă, nu pe baza poziției lor în listă, ci pe baza anumitor condiții pe care acest element trebuie să le îndeplinească. Următorul exemplu trece printr-o listă și selectează acele articole a căror valoare este mai mare de 2:

List.Selectați (MyList, fiecare _> 2) care returnează următoarea listă ca rezultate:

Uneori doriți să utilizați o anumită funcționalitate în M și să căutați funcția potrivită. Dacă, de exemplu, vreau redenumiți numele coloanei a unui tabel cu nume de coloane vaying dinamic, pot face acest lucru în M cu funcția Table.RenameColumns (). Dacă ignor ultimul parametru opțional al funcției, atunci structura sa poate fi descrisă după cum urmează:

Table.RenameColumns (Tabelele cu numele coloanelor care urmează să fie modificate, Lista cu structura)

Următoarea captură de ecran arată un script M care redenumește cele două coloane existente ale unui tabel și este pregătit pentru ca subtitrările coloanelor din tabelul original să fie modificate în timpul următoarei rulări. Redenumirea efectivă a subtitrărilor coloanei are loc în ultimul rând al expresiei let (2). Toți pașii descriși în caseta roșie (1) sunt folosiți pentru a crea lista dinamică a perechilor de nume vechi/nume noi cerute de funcția Table.RenameColumns ().

Redenumirea numelor de coloane variate dinamic

Să vedem în continuare funcțiile care generează liste.

Multe funcții din M generează liste și cele mai evidente dintre ele sunt funcțiile * .ToList:

* .ToList funcții

Binary.ToList () - Creează o listă din binare.

Record.ToList () - Convertește o înregistrare într-o listă, conținând valorile câmpului înregistrării.

Exemplu de Record.ToList ()

Table.ToList () - Creează o listă dintr-un tabel separând coloanele rând cu rând cu un separator care poate fi definit în parametrul opțional de combinare (de exemplu, Combiner.CombineTextByDelimiter (","))

Exemplu de Table.ToList ()

Text.ToList () - Creează o listă dintr-un text adăugând fiecare caracter individual ca element de listă.

Exemplu de Text.ToList ()

Cu toate acestea, funcțiile * .ToList nu sunt singurele funcții care generează o listă dintr-o valoare de un anumit tip.

Alte funcții, care creează liste

Pentru unele dintre funcții, numele nu sugerează crearea listelor. Un exemplu în acest sens este funcția Text.Split (). Imaginați-vă urmând sarcina: Într-un text lung, numărați numărul de cuvinte distincte. Următorul script face acest lucru utilizând Text.Split () în combinație cu alte funcții de listă.

Folosind Text.Split () pentru a număra cuvinte (distincte)

Alte exemple de funcții, care returnează liste, dar nu sună așa sunt:

Chiar dacă există multe mai multe de spus despre liste și capacitățile lor, cred că devine clar că listele au farmecul lor și că este necesar să se ocupe de ele pentru a stăpâni limbajul M.

Salutari din Germania,

Lars este consultant, dezvoltator și antrenor pentru Microsoft Power BI. Este un expert Power BI certificat și Microsoft Trainer. Pentru implicarea sa în comunitatea internațională, Lars a fost implicat în premiul MVP pentru Microsoft din 2017. Mai zace aici ...