บทนำ
ภาพรวม
Microsoft Power Query มอบประสบการณ์ "รับข้อมูล" อันทรงประสิทธิภาพที่ครอบคลุมคุณลักษณะหลายอย่าง ความสามารถหลักของ Power Query คือการกรองและจุดกลุ่ม นั่นคือ "การรวม" ข้อมูลจากคอลเลกชันของแหล่งข้อมูลที่ได้รับการสนับสนุนอย่างน้อยหนึ่งรายการ การรวมข้อมูลดังกล่าวจะแสดงโดยใช้ภาษาสูตร Power Query (รู้จักกันอย่างไม่เป็นทางการว่า "M") Power Query จะฝังเอกสาร M ในผลิตภัณฑ์ Microsoft ที่หลากหลาย รวมถึง Excel, Power BI, Analysis Services และ Dataverse เพื่อเปิดใช้งานการรวมข้อมูลที่ทําซ้ําได้
เอกสารนี้มีข้อมูลจําเพาะสําหรับ M หลังจากการแนะนําแบบย่อที่มีจุดมุ่งหมายเพื่อสร้างการหยอกหลีกแรกและความคุ้นเคยกับภาษาเอกสารครอบคลุมภาษาอย่างแม่นยําในขั้นตอนต่อเนื่องหลายขั้นตอน:
โครงสร้างเลกซิคัลจะกําหนดชุดของข้อความที่ถูกต้องตามเลกซิคัล
ค่า นิพจน์ สภาพแวดล้อมและตัวแปร ตัวระบุ และแบบจําลองการประเมินจะสร้างแนวคิดพื้นฐานของภาษา
ข้อมูลจําเพาะโดยละเอียดของ ค่า ทั้งแบบดั้งเดิมและแบบมีโครงสร้าง จะกําหนดโดเมนเป้าหมายของภาษาดังกล่าว
ค่าต่าง ๆ มี ชนิด เป็นค่าชนิดพิเศษที่กําหนดลักษณะเฉพาะของค่าชนิดพื้นฐาน และดําเนินการด้วยเมตาดาต้าเพิ่มเติมที่เป็นข้อมูลเฉพาะสําหรับรูปร่างของค่าที่มีโครงสร้าง
ชุดของ ตัว ดําเนินการใน M จะกําหนดชนิดของนิพจน์ที่สามารถสร้างได้
ฟังก์ชัน ค่าพิเศษอีกชนิดหนึ่ง ระบุพื้นฐานสําหรับไลบรารีมาตรฐานสําหรับ M และอนุญาตให้สามารถเพิ่มนามธรรมใหม่ได้
ข้อผิดพลาด สามารถเกิดขึ้นได้ขณะปรับใช้ตัวดําเนินการหรือฟังก์ชันต่างๆ ในระหว่างการประเมินนิพจน์ ในขณะที่ข้อผิดพลาดไม่ใช่ค่า มีวิธีใน การจัดการข้อผิดพลาด ที่แมปข้อผิดพลาดกลับไปยังค่า
นิพจน์ ให้ อนุญาตให้มีการแนะนําข้อกําหนดเสริมที่ใช้ในการสร้างนิพจน์ที่ซับซ้อนด้วยขั้นตอนที่น้อยกว่านี้
นิพจน์ ถ้า สนับสนุนการประเมินแบบมีเงื่อนไข
ส่วน มีกลไกมอดูลลิตี้อย่างง่าย (Power Query. ยังไม่ได้ใช้ประโยชน์จากส่วน)
ใน ตอนท้าย ไวยากรณ์ รวมจะรวบรวมส่วนต่างๆ ของไวยากรณ์จากส่วนอื่นๆ ทั้งหมดของเอกสารนี้ไปยังข้อกําหนดแบบสมบูรณ์เพียงรายการเดียว
สําหรับนักทฤษฎีด้านภาษาคอมพิวเตอร์: ภาษาสูตรที่ระบุในเอกสารนี้ โดยส่วนใหญ่เป็นภาษาบริสุทธิ์ อยู่ในลําดับที่สูงกว่า เป็นชนิดไดนามิก และมีการใช้งานแบบขี้เกียจบางส่วน
นิพจน์และค่า
คอนสตรัคเตอร์ส่วนกลางใน M คือนิพจน์ สามารถประเมินนิพจน์ (คํานวณ) ให้ส่งค่าเดียวได้
แม้ว่าคุณสามารถเขียนค่าจํานวนมากเป็นนิพจน์ได้อย่างแท้จริง แต่ค่าจะไม่ใช่นิพจน์ ตัวอย่างเช่น นิพจน์ 1
จะประเมินเป็นค่า 1; นิพจน์ 1+1
จะประเมินเป็นค่า 2 ความแตกต่างนี้จะละเอียดมาก แต่มีความสําคัญมาก นิพจน์เป็นสูตรสําหรับการประเมินผล ค่า คือผลลัพธ์ของการประเมิน
ตัวอย่างต่อไปนี้แสดงชนิดของค่าต่าง ๆ ที่พร้อมใช้งานใน M ตามแบบแผน ค่าจะถูกเขียนโดยใช้รูปแบบสัญพจน์ซึ่งจะปรากฏในนิพจน์ที่ประเมินเป็นค่านั้น (โปรดทราบว่า //
ระบุถึงจุดเริ่มต้นของข้อคิดเห็นที่ยังคงอยู่จนถึงจุดสิ้นสุดของบรรทัด)
ค่าแรกเริ่มเป็นค่าส่วนเดียว เช่น ตัวเลข ตรรกะ ข้อความ หรือ null ค่า null สามารถใช้เพื่อระบุการขาดหายไปของข้อมูลใด ๆ
123 // A number true // A logical "abc" // A text null // null value
ค่ารายการ เป็นลําดับค่าที่มีการเรียงลําดับ M สนับสนุนรายการอนันต์ แต่หากเขียนเป็นสัญพจน์ รายการจะมีความยาวคงที่ อักขระ
{
เครื่องหมายวงเล็บปีกกา และ}
แสดงจุดเริ่มต้นและสิ้นสุดของรายการ{123, true, "A"} // list containing a number, a logical, and // a text {1, 2, 3} // list of three numbers
เรกคอร์ดคือชุดของเขตข้อมูล เขตข้อมูล คือคู่ชื่อ/ค่าที่ชื่อเป็นค่าข้อความที่ไม่ซ้ํากันภายในเรกคอร์ดของเขตข้อมูล ไวยากรณ์สัญพจน์สําหรับค่าเรกคอร์ด อนุญาตให้สามารถเขียนชื่อได้โดยไม่มีอัญประกาศ รูปแบบนี้ยังเรียกว่าเป็น ตัวระบุ อีกด้วย รายการต่อไปนี้แสดงเรกคอร์ดที่มีเขตข้อมูลสามรายการที่มีชื่อว่า "
A
", "B
" และ "C
" ซึ่งมีค่า1
,2
และ3
[ A = 1, B = 2, C = 3 ]
ตาราง คือชุดของค่าที่จัดระเบียบลงในคอลัมน์ (ซึ่งระบุโดยชื่อ) และแถว ไม่มีไวยากรณ์สัญพจน์สําหรับการสร้างตาราง แต่มีฟังก์ชันมาตรฐานต่างๆ ที่สามารถใช้เพื่อสร้างตารางจากรายการหรือเรกคอร์ด
ตัวอย่างเช่น
#table( {"A", "B"}, { {1, 2}, {3, 4} } )
การดําเนินการนี้จะสร้างตารางที่มีรูปร่างต่อไปนี้:
ฟังก์ชัน คือค่าที่ทําให้เกิดค่าใหม่ เมื่อเรียกใช้กับอาร์กิวเมนต์ ฟังก์ชันจะถูกเขียนโดยการแสดงรายการพารามิเตอร์ของฟังก์ชันในวงเล็บ ตามด้วยสัญลักษณ์
=>
และตามด้วยนิพจน์ที่กําหนดฟังก์ชัน โดยทั่วไป นิพจน์ดังกล่าวจะอ้างอิงถึงพารามิเตอร์ (ตามชื่อ)(x, y) => (x + y) / 2`
การประเมิน
แบบจําลองการประเมินผลของภาษา M จะถูกจัดรูปแบบหลังจากที่พบแบบจําลองการประเมินโดยทั่วไปในสเปรดชีต ซึ่งสามารถกําหนดลําดับการคํานวณโดยยึดตามการขึ้นต่อกันระหว่างสูตรต่างๆ ในเซลล์
หากคุณเขียนสูตรในสเปรดชีตเช่น Excel คุณอาจรู้จักสูตรทางด้านซ้ายของผลลัพธ์ทางด้านขวาเมื่อคํานวณแล้ว:
ใน M ส่วนต่างๆ ของนิพจน์สามารถอ้างอิงถึงส่วนอื่นๆ ของนิพจน์ตามชื่อ และกระบวนการประเมินผลจะกําหนดลําดับที่มีการคํานวณนิพจน์ที่อ้างอิงโดยอัตโนมัติ
คุณสามารถใช้เรกคอร์ดเพื่อสร้างนิพจน์ที่เทียบเท่ากับตัวอย่างสเปรดชีตก่อนหน้าได้ เมื่อเริ่มต้นค่าของเขตข้อมูล คุณสามารถอ้างอิงไปยังเขตข้อมูลอื่นภายในเรกคอร์ดโดยใช้ชื่อของเขตข้อมูลดังนี้:
[
A1 = A2 * 2,
A2 = A3 + 1,
A3 = 1
]
นิพจน์ข้างต้นเทียบเท่ากับรายการต่อไปนี้ (ในการประเมินค่าที่เท่ากัน):
[
A1 = 4,
A2 = 2,
A3 = 1
]
ระเบียนสามารถมีอยู่ภายใน หรือ ซ้อนกันภายในระเบียนอื่น คุณสามารถใช้ตัว ดําเนินการ ค้นหา ([]
) เพื่อเข้าถึงเขตข้อมูลของเรกคอร์ดตามชื่อได้ ตัวอย่างเช่น เรกคอร์ดต่อไปนี้มีเขตข้อมูลที่ชื่อว่า Sales
ซึ่งมีเรกคอร์ด และเขตข้อมูลที่ Total
ชื่อว่า ซึ่งเข้าถึง FirstHalf
เขตข้อมูล และ SecondHalf
ของ Sales
เรกคอร์ด:
[
Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
Total = Sales[FirstHalf] + Sales[SecondHalf]
]
นิพจน์ข้างต้นเทียบเท่ากับรายการต่อไปนี้เมื่อมีการประเมิน:
[
Sales = [ FirstHalf = 1000, SecondHalf = 1100 ],
Total = 2100
]
นอกจากนี้ ยังสามารถมีเรกคอร์ดภายในรายการได้อีกด้วย คุณสามารถใช้ ตัว ดําเนินการ ดัชนีตําแหน่ง ({}
) เพื่อเข้าถึงหน่วยข้อมูลในรายการตามดัชนีตัวเลข ค่าภายในรายการจะถูกอ้างอิงโดยใช้ดัชนีที่ยึดตามศูนย์จากจุดเริ่มต้นของรายการ ตัวอย่างเช่น มีการใช้ดัชนี 0
และ 1
เพื่ออ้างอิงหน่วยข้อมูลที่หนึ่งและสองในรายการด้านล่าง:
[
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
]
นิพจน์สมาชิกของเรกคอร์ดและรายการ (รวมถึง นิพจน์ ให้) จะถูกประเมินโดยใช้ การประเมินแบบขี้เกียจ ซึ่งหมายความว่านิพจน์เหล่านั้นได้รับการประเมินเมื่อจําเป็นเท่านั้น นิพจน์อื่น ๆ ทั้งหมดจะถูกประเมินโดยใช้ การประเมินผลกระตือรือร้น ซึ่งหมายความว่านิพจน์เหล่านั้นจะได้รับการประเมินทันทีเมื่อพบในระหว่างกระบวนการประเมินผล วิธีการที่ดีอีกวิธีหนึ่งคือ จดจําว่าการประเมินรายการหรือนิพจน์เรกคอร์ดจะแสดงรายการหรือค่าเรกคอร์ดที่ระบบจดจําว่าจําเป็นต้องคํานวณเขตข้อมูลเรกคอร์ดหรือหน่วยข้อมูลของรายการอย่างไร เมื่อได้รับคําขอ (โดยตัวดําเนินการค้นหาหรือดัชนี)
ฟังก์ชัน
ใน M ฟังก์ชัน คือการแมปจากชุดของค่าอินพุตไปยังค่าเอาต์พุตเดียว ฟังก์ชันจะถูกเขียนโดยการตั้งชื่อชุดค่าอินพุตที่จําเป็น (พารามิเตอร์ของฟังก์ชันดังกล่าว) จากนั้นการระบุนิพจน์ที่คํานวณผลลัพธ์ของฟังก์ชันโดยใช้ค่าอินพุตเหล่านั้น (เนื้อความของฟังก์ชัน) ตามด้วยสัญลักษณ์ (=>
) ตัวอย่างเช่น
(x) => x + 1 // function that adds one to a value
(x, y) => x + y // function that adds two values
ฟังก์ชัน เป็นค่าเช่นเดียวกับค่าตัวเลขหรือข้อความ ตัวอย่างต่อไปนี้แสดงฟังก์ชันที่เป็นค่าของเขตข้อมูล เพิ่ม ซึ่งจากนั้น จะถูกเรียกใช้ หรือปฏิบัติการ จากเขตข้อมูลอื่นๆ เมื่อมีการเรียกใช้ฟังก์ชัน ระบบจะระบุชุดของค่าที่แทนที่เชิงตรรกะสําหรับชุดค่าอินพุตที่จําเป็นภายในนิพจน์เนื้อความของฟังก์ชัน
[
Add = (x, y) => x + y,
OnePlusOne = Add(1, 1), // 2
OnePlusTwo = Add(1, 2) // 3
]
ไลบรารี
M รวมถึงชุดข้อกําหนดทั่วไปที่พร้อมใช้งานสําหรับการใช้จากนิพจน์ที่เรียกว่า ไลบรารีมาตรฐาน หรือเรียกสั้นๆ ว่าไลบรารี ข้อกําหนดเหล่านี้ประกอบด้วยชุดของค่าที่มีชื่อ ชื่อของค่าที่ระบุโดยไลบรารีมีไว้สําหรับใช้ภายในนิพจน์หนึ่ง โดยไม่จําเป็นต้องกําหนดอย่างชัดแจ้งโดยนิพจน์ดังกล่าว ตัวอย่างเช่น
Number.E // Euler's number e (2.7182...)
Text.PositionOf("Hello", "ll") // 2
ตัวดำเนินการ
M รวมถึงชุดของตัวดําเนินการที่สามารถใช้ในนิพจน์ต่างๆ ได้ ตัวดําเนินการจะถูกนําไปใช้กับตัวถูกดําเนินการเพื่อสร้างนิพจน์สัญลักษณ์ ตัวอย่างเช่น ในนิพจน์ 1 + 2
ตัวเลข 1
และ 2
เป็นตัวถูกดําเนินการ และตัวดําเนินการคือตัวดําเนินการเพิ่มเติม (+
)
ความหมายของตัวดําเนินการอาจแตกต่างกันโดยขึ้นอยู่กับชนิดของค่าตัวถูกดําเนินการ ตัวอย่างเช่น ตัวดําเนินการบวก สามารถใช้กับค่าชนิดอื่น นอกเหนือจากตัวเลขได้:
1 + 2 // numeric addition: 3
#time(12,23,0) + #duration(0,0,2,0)
// time arithmetic: #time(12,25,0)
ตัวอย่างอื่นของตัวดําเนินการที่มีความหมายขึ้นอยู่กับตัวถูกดําเนินการคือ ตัวดําเนินการรวม (&
):
"A" & "BC" // text concatenation: "ABC"
{1} & {2, 3} // list concatenation: {1, 2, 3}
[ a = 1 ] & [ b = 2 ] // record merge: [ a = 1, b = 2 ]
โปรดทราบว่าตัวดําเนินการบางตัวไม่สนับสนุนการรวมค่าทั้งหมด ตัวอย่างเช่น
1 + "2" // error: adding number and text isn't supported
นิพจน์ที่เมื่อประเมิน จะพบเงื่อนไขของตัวดําเนินการที่ไม่ได้กําหนดจะประเมินเป็นข้อผิดพลาด
เมตาดาต้า
เมตาดาต้า คือข้อมูลเกี่ยวกับค่าที่เชื่อมโยงกับค่า เมตาดาต้าจะแสดงเป็นค่าเรกคอร์ด ที่เรียกว่า เรกคอร์ดเมตาดาต้า เขตข้อมูลของเรกคอร์ดเมตาดาต้าสามารถใช้เพื่อจัดเก็บเมตาดาต้าสําหรับค่าได้
ทุกค่ามีเรกคอร์ดเมตาดาต้า หากไม่ได้ระบุค่าของเรกคอร์ดเมตาดาต้า เรกคอร์ดเมตาดาต้าจะว่างเปล่า (ไม่มีเขตข้อมูล)
เรกคอร์ดของเมตาดาต้าจะแสดงวิธีการเชื่อมโยงข้อมูลเพิ่มเติมกับค่าชนิดใดๆ ในลักษณะที่ไม่ขัดขวางการทํางาน การเชื่อมโยงเรกคอร์ดของเมตาดาต้ากับค่าหนึ่งๆ จะไม่เปลี่ยนแปลงค่าหรือลักษณะการทํางาน
ค่าy
เรกคอร์ดของเมตาดาต้า จะเชื่อมโยงกับค่าx
ที่มีอยู่โดยใช้ไวยากรณ์x meta y
ตัวอย่างเช่น โค้ดต่อไปนี้เชื่อมโยงเรกคอร์ดของเมตาดาต้ากับ Rating
เขตข้อมูล และ Tags
ที่มีค่า "Mozart"
ข้อความ :
"Mozart" meta [ Rating = 5, Tags = {"Classical"} ]
สําหรับค่าต่างๆ ที่ดําเนินการไปแล้วใช้เรกคอร์ดของเมตาดาต้าที่ไม่ว่างเปล่า ผลลัพธ์ของการปรับใช้เมตาคือผลลัพธ์ของการคํานวณการผสานเรกคอร์ดของเรกคอร์ดเมตาดาต้าใหม่และที่มีอยู่ ตัวอย่างเช่น นิพจน์สองรายการต่อไปนี้จะเทียบเท่ากันและกัน และเทียบเท่ากับนิพจน์ก่อนหน้า:
("Mozart" meta [ Rating = 5 ]) meta [ Tags = {"Classical"} ]
"Mozart" meta ([ Rating = 5 ] & [ Tags = {"Classical"} ])
เรกคอร์ดของเมตาดาต้าสามารถเข้าถึงได้สําหรับค่าที่กําหนดโดยใช้ฟังก์ชัน Value.Metadata ในตัวอย่างต่อไปนี้ นิพจน์ใน ComposerRating
เขตข้อมูล จะเข้าถึงเรกคอร์ดของเมตาดาต้าของค่าใน Composer
เขตข้อมูล จากนั้น จะเข้าถึง Rating
เขตข้อมูล ของเรกคอร์ดของเมตาดาต้า
[
Composer = "Mozart" meta [ Rating = 5, Tags = {"Classical"} ],
ComposerRating = Value.Metadata(Composer)[Rating] // 5
]
กําหนดนิพจน์
ตัวอย่างจํานวนมากที่แสดงจะรวมค่าสัญพจน์ทั้งหมดของนิพจน์ไว้ในผลลัพธ์ของนิพจน์ นิพจน์ let
อนุญาตให้มีการคํานวณชุดค่า ชื่อที่กําหนด จากนั้นจะใช้ในนิพจน์ที่ตามมา ซึ่งตามหลังin
ตัวอย่างเช่น ในตัวอย่างข้อมูลยอดขายของเรา คุณสามารถทําสิ่งต่อไปนี้ได้:
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
ผลลัพธ์ของนิพจน์ข้างต้นคือค่าตัวเลข (4600
) ที่คํานวณจากค่าที่ผูกไว้กับชื่อ Sales2007
และSales2008
นิพจน์ ถ้า
if
นิพจน์ จะเลือกระหว่างนิพจน์สองรายการโดยยึดตามเงื่อนไขตรรกะ ตัวอย่างเช่น
if 2 > 1 then
2 + 2
else
1 + 1
นิพจน์แรก (2 + 2
) จะถูกเลือก หากนิพจน์เชิงตรรกะ (2 > 1
) เป็นจริง และนิพจน์ที่สอง (1 + 1
) จะถูกเลือก หากเป็นเท็จ นิพจน์ที่เลือก (ในกรณีนี้ 2 + 2
) จะถูกประเมินและกลายเป็นผลลัพธ์ของ if
นิพจน์ (4
)
ข้อผิดพลาด
ข้อผิดพลาดคือข้อบ่งชี้ว่ากระบวนการประเมินนิพจน์ไม่สามารถสร้างค่าได้
ข้อผิดพลาดเกิดจากตัวดําเนินการและฟังก์ชันที่เป็นไปตามเงื่อนไขของข้อผิดพลาดหรือโดยใช้นิพจน์ข้อผิดพลาด ข้อผิดพลาดจะได้รับการจัดการโดยใช้ try
นิพจน์ เมื่อเกิดข้อผิดพลาด จะมีการระบุค่าที่สามารถใช้เพื่อระบุสาเหตุที่เกิดข้อผิดพลาด
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])
ตัวอย่างข้างต้นเข้าถึง Sales[UnitPrice]
เขตข้อมูล และจัดรูปแบบค่าทําให้เกิดผลลัพธ์:
"Unit Price: 2"
ถ้าUnits
เขตข้อมูล เป็นศูนย์ UnitPrice
จากนั้นเขตข้อมูล จะทําให้เกิดข้อผิดพลาด ซึ่งจะถูกจัดการโดยtry
จากนั้น ค่าผลลัพธ์จะเป็นดังนี้:
"No Units"
นิพจน์ try
แปลงค่าและข้อผิดพลาดที่เหมาะสมเป็นค่าเรกคอร์ดที่ระบุว่า try
นิพจน์จัดการกับข้อผิดพลาดหรือไม่ และค่าที่เหมาะสมหรือเรกคอร์ดข้อผิดพลาดถูกแยกออกเมื่อจัดการข้อผิดพลาดหรือไม่ ตัวอย่างเช่น พิจารณานิพจน์ต่อไปนี้ที่ทําให้เกิดข้อผิดพลาด และจัดการทันที:
try error "negative unit count"
นิพจน์นี้จะประเมินเป็นค่าเรกคอร์ดที่ซ้อนกันต่อไปนี้ โดย [HasError]
อธิบายการค้นหาเขตข้อมูล , [Error]
และ [Message]
ในตัวอย่างหน่วย-ราคาก่อนหน้า
[
HasError = true,
Error =
[
Reason = "Expression.Error",
Message = "negative unit count",
Detail = null
]
]
กรณีทั่วไปคือการแทนที่ข้อผิดพลาดด้วยค่าเริ่มต้น นิพจน์ try
สามารถใช้กับคําสั่งทางเลือก otherwise
เพื่อให้ได้ผลลัพธ์ในรูปแบบที่กะทัดรัด:
try error "negative unit count" otherwise 42
// 42