Sdílet prostřednictvím


Úvod

Přehled

Microsoft Power Query poskytuje výkonné prostředí pro získání dat, které zahrnuje mnoho funkcí. Základní funkcí Power Query je filtrování a kombinování dat z jedné nebo několika podporovaných zdrojů dat. Jakékoli takové mashupy dat se vyjadřují pomocí jazyka vzorců Power Query (neformálně označovaného jako "M"). Power Query vkládá dokumenty M do široké škály produktů Microsoftu, včetně Excelu, Power BI, Analysis Services a Dataverse, aby bylo možné opakovatelné mashupy dat.

Tento dokument obsahuje specifikaci jazyka M. Po krátkém úvodu, jehož cílem je vytvořit určitou první citlivost a znalost jazyka, se dokument věnuje jazyku přesně v několika progresivních krocích:

  1. lexikální struktura definuje sadu textů, které jsou lexicky platné.

  2. Hodnoty, výrazy, prostředí a proměnné, identifikátory a model vyhodnocení tvoří základních konceptů jazyka.

  3. Podrobná specifikace hodnot, primitivní i strukturovaná, definuje cílovou doménu jazyka.

  4. Hodnoty mají typy, samy o sobě zvláštní druh hodnoty, které charakterizují základní druhy hodnot a nesou další metadata, která jsou specifická pro tvary strukturovaných hodnot.

  5. Sada operátorů v jazyce M definuje, jaké druhy výrazů lze vytvořit.

  6. Functions, další druh speciálních hodnot, poskytují základ pro bohatou standardní knihovnu pro M a umožňují přidat nové abstrakce.

  7. Chyby mohou nastat při použití operátorů nebo funkcí během vyhodnocení výrazu. I když chyby nejsou hodnoty, existují způsoby, jak zpracovat chyby, které mapují chyby zpět na hodnoty.

  8. Výrazy Let umožňují zavedení pomocných definic používaných k vytvoření složitých výrazů v menších krocích.

  9. Výrazy If podporují podmíněné vyhodnocení.

  10. Sekce poskytují jednoduchý modulární mechanismus. (Power Query zatím nevyužívá oddíly.)

  11. Nakonec konsolidovaná gramatika shromažďuje gramatické fragmenty ze všech ostatních částí tohoto dokumentu do jediné kompletní definice.

Pro teoretiky počítačového jazyka: jazyk vzorců zadaný v tomto dokumentu je převážně čistý, vyššího řádu, dynamicky typovaný, částečně líný funkcionální jazyk.

Výrazy a hodnoty

Centrální konstrukce v jazyce M je výraz . Výraz lze vyhodnotit (vypočítat) a získat tak jedinou hodnotu .

I když mnoho hodnot lze zapsat doslova jako výraz, hodnota není výraz. Například výraz 1 vyhodnotí hodnotu 1; výrazy 1+1 vyhodnotí na hodnotu 2. Toto rozlišení je jemné, ale důležité. Výrazy jsou recepty pro vyhodnocení; hodnoty jsou výsledky vyhodnocení.

Následující příklady ilustrují různé druhy hodnot dostupných v jazyce M. Jako konvence se hodnota zapisuje pomocí literálového tvaru, ve kterém by se zobrazily ve výrazu, který se vyhodnotí jako pouze tato hodnota. (Všimněte si, že // označuje začátek komentáře, který pokračuje na konec řádku.)

  • primitivní hodnota je jednosložková hodnota, například číslo, logická hodnota, text nebo null. Hodnotu null lze použít k označení nepřítomnosti jakýchkoli dat.

    123                  // A number
    true                 // A logical
    "abc"                // A text
    null                 // null value
    
  • Hodnota seznamu je seřazená posloupnost hodnot. Jazyk M podporuje nekonečné seznamy, ale pokud jsou zapsány jako literál, mají pevnou délku. Složené závorky { a } označují začátek a konec seznamu.

    {123, true, "A"}     // list containing a number, a logical, and 
                          //     a text 
    {1, 2, 3}            // list of three numbers 
    
  • záznam je sada polí. Pole je dvojice název/hodnota, kde je název textovou hodnotou, která je jedinečná v záznamu pole. Literální syntaxe pro hodnoty záznamu umožňuje zápis názvů bez uvozovek, formulář označovaný také jako identifikátory. Následující příklad ukazuje záznam obsahující tři pole s názvem "A", "B" a "C", které mají hodnoty 1, 2a 3.

    [ 
          A = 1,  
          B = 2,  
          C = 3 
    ]
    
  • Tabulka je sada hodnot uspořádaných do sloupců (které jsou identifikovány podle názvu) a řádků. Pro vytvoření tabulky neexistuje žádná literálová syntaxe, ale existuje několik standardních funkcí, které lze použít k vytváření tabulek ze seznamů nebo záznamů.

    Například:

    #table( {"A", "B"}, { {1, 2}, {3, 4} } ) 
    

    Vytvoří se tabulka s následujícím obrazcem:

    Obrázek ukázkové tabulky v jazyce vzorců M

  • funkce je hodnota, která při použití argumentů vytvoří novou hodnotu. Funkce je napsána výpisem parametrů funkce v závorkách a následným symbolem přejít =>a výrazem definujícím funkci. Tento výraz obvykle odkazuje na parametry (podle názvu).

    (x, y) => (x + y) / 2`
    

Vyhodnocení

Model vyhodnocení jazyka M se modeluje po modelu vyhodnocení, který se běžně nachází v tabulkách, kde lze pořadí výpočtů určit na základě závislostí mezi vzorci v buňkách.

Pokud jste psali vzorce v tabulce, jako je Excel, poznáte, že vzorce nalevo vedou při výpočtu k hodnotám napravo.

Obrázek vzorců vpravo, což vede k hodnotám vlevo.

V jazyce M můžou části výrazu odkazovat na jiné části výrazu podle názvu a proces vyhodnocení automaticky určuje pořadí, ve kterém se počítají odkazované výrazy.

Záznam můžete použít k vytvoření výrazu, který odpovídá předchozímu příkladu tabulky. Při inicializaci hodnoty pole můžete odkazovat na další pole v záznamu pomocí názvu pole následujícím způsobem:

[  
    A1 = A2 * 2,  
    A2 = A3 + 1,  
    A3 = 1  
]

Výše uvedený výraz je ekvivalentní následujícímu výrazu (v tom, že se oba vyhodnocují jako stejné hodnoty):

[  
    A1 = 4,  
    A2 = 2,  
    A3 = 1  
]

Záznamy mohou být obsaženy v jiných záznamech nebo vnořenydo jiných záznamů. K přístupu k polím záznamu podle názvu můžete použít operátor vyhledávání ([]). Například následující záznam obsahuje pole s názvem Sales obsahující záznam a pole s názvem Total, které přistupuje k FirstHalf a SecondHalf polí záznamu Sales:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = Sales[FirstHalf] + Sales[SecondHalf] 
]

Výše uvedený výraz je při vyhodnocování ekvivalentní následujícímu výrazu:

[  
    Sales = [ FirstHalf = 1000, SecondHalf = 1100 ], 
    Total = 2100 
]

Záznamy mohou být také obsaženy v seznamech. Pomocí operátoru pozičního indexu ({}) můžete získat přístup k položce v seznamu pomocí číselného indexu. Hodnoty v seznamu jsou označovány použitím indexu s nulovým základem od počátku seznamu. Například indexy 0 a 1 slouží k odkazování na první a druhou položku v následujícím seznamu:

[ 
    Sales =  
        {  
            [  
                Year = 2007,  
                FirstHalf = 1000,  
                SecondHalf = 1100, 
                Total = FirstHalf + SecondHalf // 2100 
            ], 
            [  
                Year = 2008,  
                FirstHalf = 1200,  
                SecondHalf = 1300, 
                Total = FirstHalf + SecondHalf // 2500 
            ]  
        }, 
    TotalSales = Sales{0}[Total] + Sales{1}[Total] // 4600 
]

Výrazy prvků seznamu a záznamů (stejně jako výrazy let) se vyhodnocují pomocí líného vyhodnocení, což znamená, že se vyhodnocují pouze tehdy, když je to potřebné. Všechny ostatní výrazy se vyhodnocují pomocí časného vyhodnocení, což znamená, že se vyhodnocují okamžitě, jakmile na ně během procesu vyhodnocení dojde. Dobrým způsobem, jak si to představit, je pamatovat si, že vyhodnocení výrazu seznamu nebo záznamu vrátí hodnotu seznamu nebo záznamu, která si sama pamatuje, jak je potřeba vypočítat položky seznamu nebo pole záznamů, když se požaduje (pomocí operátorů vyhledávání nebo indexu).

Funkce

V jazyce M je funkce mapování ze sady vstupních hodnot na jednu výstupní hodnotu. Funkce se zapíše tak, že nejprve pojme požadovanou sadu vstupních hodnot (parametry funkce) a pak zadá výraz, který vypočítá výsledek funkce pomocí těchto vstupních hodnot (tělo funkce) za symbolem "goes-to" (=>). Například:

(x) => x + 1                    // function that adds one to a value 
(x, y) =>  x + y                // function that adds two values

Funkce je hodnota stejně jako číslo nebo textová hodnota. Následující příklad ukazuje funkci, která je hodnotou pole Add, které se pak vyvolánebo spuštěno z několika dalších polí. Při vyvolání funkce se zadává sada hodnot, které jsou logicky nahrazeny požadovanou sadou vstupních hodnot v rámci výrazu těla funkce.

[ 
    Add = (x, y) => x + y,
    OnePlusOne = Add(1, 1),     // 2 
    OnePlusTwo = Add(1, 2)      // 3
]

Knihovna

M obsahuje společnou sadu definic, které lze použít z výrazu označovaného jako standardní knihovna, nebo jen knihovnu zkráceně. Tyto definice se skládají ze sady pojmenovaných hodnot. Názvy hodnot poskytovaných knihovnou jsou k dispozici pro použití ve výrazu bez explicitního definování výrazem. Například:

Number.E                        // Euler's number e (2.7182...) 
Text.PositionOf("Hello", "ll")  // 2

Operátoři

M obsahuje sadu operátorů, které lze použít ve výrazech. operátory se použijí na operandy k vytvoření symbolických výrazů. Například ve výrazu 1 + 2 čísla 1 a 2 jsou operandy a operátor je operátor sčítání (+).

Význam operátoru se může lišit v závislosti na typu hodnot, které operandy mají. Operátor plus lze například použít s jinými typy hodnot kromě čísel:

1 + 2                   // numeric addition: 3 
#time(12,23,0) + #duration(0,0,2,0) 
                        // time arithmetic: #time(12,25,0)

Dalším příkladem operátoru, jehož význam závisí na operandu, je operátor kombinace (&):

"A" & "BC"              // text concatenation: "ABC" 
{1} & {2, 3}            // list concatenation: {1, 2, 3} 
[ a = 1 ] & [ b = 2 ]   // record merge: [ a = 1, b = 2 ]

Všimněte si, že některé operátory nepodporují všechny kombinace hodnot. Například:

1 + "2"  // error: adding number and text isn't supported

Výrazy, které při vyhodnocování narazí na nedefinované podmínky operátoru, se vyhodnotí jako chyby.

Metadata

Metadata jsou informace o hodnotě, která je spojená s jinou hodnotou. Metadata jsou reprezentována jako hodnota záznamu, označovaná jako záznam metadat . Pole záznamu metadat lze použít k uložení metadat pro hodnotu.

Každá hodnota má záznam metadat. Pokud nebyla zadána hodnota záznamu metadat, záznam metadat je prázdný (neobsahuje žádná pole).

Záznamy metadat poskytují způsob, jak přidružit další informace k jakémukoli druhu hodnoty nerušivým způsobem. Přidružení záznamu metadat k hodnotě nemění hodnotu ani její chování.

Hodnota záznamu metadat y je přidružena k existující hodnotě x pomocí syntaxe x meta y. Následující kód například přidruží záznam metadat k Rating a Tags polím s textovou hodnotou "Mozart":

"Mozart" meta [ Rating = 5, Tags = {"Classical"} ]

U hodnot, které již obsahují neprázdný záznam metadat, je výsledkem použití meta výpočtu sloučení záznamu existujícího a nového záznamu metadat. Například následující dva výrazy jsou vzájemně ekvivalentní a předchozímu výrazu:

("Mozart" meta [ Rating = 5 ]) meta [ Tags = {"Classical"} ] 
"Mozart" meta ([ Rating = 5 ] & [ Tags = {"Classical"} ])

Záznam metadat je přístupný pro danou hodnotu pomocí funkce Value.Metadata. V následujícím příkladu výraz v poli ComposerRating přistupuje k záznamu metadat hodnoty v poli Composer a pak přistupuje k Rating poli záznamu metadat.

[ 
    Composer = "Mozart" meta [ Rating = 5, Tags = {"Classical"} ], 
    ComposerRating = Value.Metadata(Composer)[Rating] // 5
]

Výraz Let

Mnoho příkladů, které jsme zatím ukázali, zahrnovaly všechny literální hodnoty výrazu ve výsledku výrazu. Výraz let umožňuje vypočítat sadu hodnot, přiřadit názvy a pak použít v následném výrazu, který následuje za in. Například v našem příkladu prodejních dat můžete provést:

let 
    Sales2007 =  
        [  
            Year = 2007,  
            FirstHalf = 1000,  
            SecondHalf = 1100, 
            Total = FirstHalf + SecondHalf // 2100 
        ], 
    Sales2008 =  
        [  
            Year = 2008,  
            FirstHalf = 1200,  
            SecondHalf = 1300, 
            Total = FirstHalf + SecondHalf // 2500 
        ] 
  in Sales2007[Total] + Sales2008[Total] // 4600

Výsledkem výše uvedeného výrazu je číselná hodnota (4600), která se vypočítá z hodnot vázaných na názvy Sales2007 a Sales2008.

Výraz If

Výraz if vybere mezi dvěma výrazy na základě logické podmínky. Například:

if 2 > 1 then
    2 + 2
else  
    1 + 1

První výraz (2 + 2) je vybrán, pokud je logický výraz (2 > 1) pravdivý a druhý výraz (1 + 1) je vybrán, pokud je nepravda. Vybraný výraz (v tomto případě 2 + 2) se vyhodnotí a stane se výsledkem výrazu if (4).

Chyby

Chyba značí, že proces vyhodnocení výrazu nemohl vytvořit hodnotu.

Chyby jsou vyvolány operátory a funkcemi při chybových podmínkách nebo použitím chybového výrazu. Chyby se zpracovávají pomocí výrazu try. Při vyvolání chyby je zadána hodnota, která se dá použít k označení, proč k chybě došlo.

let Sales = 
    [ 
        Revenue = 2000, 
        Units = 1000, 
        UnitPrice = if Units = 0 then error "No Units"
                    else Revenue / Units 
    ], 
    UnitPrice = try Number.ToText(Sales[UnitPrice])
in "Unit Price: " & 
    (if UnitPrice[HasError] then UnitPrice[Error][Message]
    else UnitPrice[Value])

Výše uvedený příklad přistupuje k poli Sales[UnitPrice] a formátuje hodnotu, která vytvoří výsledek:

"Unit Price: 2"

Pokud by pole Units bylo nula, pak by pole UnitPrice vyvolalo chybu, která by byla zpracována try. Výsledná hodnota by pak byla:

"No Units"

Výraz try převede správné hodnoty a chyby na hodnotu záznamu, která označuje, jestli výraz try zpracovával chybu, nebo ne, a buď správnou hodnotu, nebo chybový záznam extrahovaný při zpracování chyby. Představte si například následující výraz, který vyvolá chybu, a pak ji okamžitě zpracuje:

try error "negative unit count"

Tento výraz se vyhodnotí jako následující vnořená hodnota záznamu, která vysvětluje [HasError], [Error]a [Message] vyhledávání polí v předchozím příkladu jednotkové ceny.

[ 
    HasError = true, 
    Error = 
        [ 
            Reason = "Expression.Error", 
            Message = "negative unit count", 
            Detail = null 
        ] 
]

Běžným případem je nahrazení chyb výchozími hodnotami. Výraz try lze použít s volitelnou klauzulí otherwise k dosažení pouze toho v kompaktní podobě:

try error "negative unit count" otherwise 42 
// 42