การจัดการการแปลง

ในกรณีที่การตอบสนองของแหล่งข้อมูลไม่แสดงในรูปแบบที่ Power BI สามารถใช้ได้โดยตรง คุณสามารถใช้Power Queryเพื่อปฏิบัติตามชุดการแปลงได้

การแปลงแบบคงที่

ในกรณีส่วนใหญ่ ข้อมูลจะถูกนําเสนอในลักษณะที่สอดคล้องกันโดยแหล่งข้อมูล: ชื่อคอลัมน์ ชนิดข้อมูล และโครงสร้างแบบลวบชั้นจะสอดคล้องกันกับจุดสิ้นสุดที่มอบให้ ในสถานการณ์นี้ มันเหมาะสมที่จะใช้ชุดการแปลงเดียวกันเพื่อรับข้อมูลในรูปแบบที่ยอมรับได้กับ Power BI เสมอ

ตัวอย่างของการแปลงแบบคงที่สามารถค้นหาได้ใน TripPin ส่วนที่ 2 - ตัวเชื่อมต่อ ข้อมูลในบทช่วยสอนบริการ REST เมื่อแหล่งข้อมูลจะถือว่าเป็นบริการ REST มาตรฐาน:

let
    Source = TripPin.Feed("https://services.odata.org/v4/TripPinService/Airlines"),
    value = Source[value],
    toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    expand = Table.ExpandRecordColumn(toTable, "Column1", {"AirlineCode", "Name"}, {"AirlineCode", "Name"})
in
    expand

การแปลงในตัวอย่างนี้คือ:

  1. Source เป็นระเบียนที่ส่งกลับจากการเรียก TripPin.Feed(...) ไปยัง
  2. คุณดึงค่าจาก Source คู่คีย์-ค่าใดคู่หนึ่ง ชื่อของคีย์คือ value และคุณจัดเก็บผลลัพธ์ในตัวแปร value ที่เรียกว่า
  3. value คือรายการที่คุณแปลงเป็นตาราง แต่ละ value องค์ประกอบใน จะกลายเป็นแถวในตาราง ซึ่งสามารถเรียกใช้ toTable
  4. แต่ละองค์ประกอบ value ใน เป็นเรกคอร์ด toTable มีทั้งหมดเหล่านี้ในคอลัมน์ "Column1" เดียว: ขั้นตอนนี้ดึงข้อมูลทั้งหมดที่มีคีย์ "AirlineCode" ลงในคอลัมน์ที่ "AirlineCode" เรียก และข้อมูลทั้งหมดที่มี "Name" คีย์ลงในคอลัมน์ "Name" ที่ชื่อว่า ให้กับแต่ละแถว toTable ใน "Column1" จะถูกแทนที่ด้วยคอลัมน์ใหม่สองคอลัมน์นี้

ในตอนท้ายของวัน คุณเหลือข้อมูลในรูปแบบตารางอย่างง่ายที่ Power BI สามารถใช้ และแสดงได้อย่างง่ายดาย:

ข้อมูลในแบบฟอร์มแบบตาราง

สิ่งสําคัญคือต้องทราบว่าลดับของการแปลงแบบคงที่ของความเฉพาะเจาะจงนี้สามารถใช้ได้กับจุดสิ้นสุด เดียว เท่านั้น ในตัวอย่างข้างต้น ลดับการแปลงนี้จะใช้ได้เฉพาะถ้ามีอยู่ในการตอบสนองจุดสิ้นสุด REST เนื่องจากรหัสเหล่านี้มีรหัสแบบฮาร์ด "AirlineCode" "Name" โค้ดลงในรหัส M ดังนั้น ลดับการแปลงนี้อาจใช้ไม่ได้ถ้าคุณพยายามไปยัง /Event จุดสิ้นสุด

ข้อมูลเฉพาะระดับสูงนี้อาจจําเป็นในการส่งข้อมูลไปยังตารางการนําทาง แต่โดยทั่วไปแล้วฟังก์ชันการเข้าถึงข้อมูลโดยทั่วไปขอแนะนําให้คุณปฏิบัติตามเฉพาะการแปลงข้อมูลที่เหมาะสมกับจุดสิ้นสุดทั้งหมดเท่านั้น

หมายเหตุ

ตรวจสอบให้แน่ใจว่าได้ทดสอบการแปลงข้อมูลภายใต้สถานการณ์ข้อมูลที่หลากหลาย ถ้าผู้ใช้ไม่มีข้อมูลใด ๆ ที่จุด /airlines สิ้นสุด การแปลงของคุณจะส่งผลให้ตารางว่างเปล่าที่มี Schema ที่ถูกต้องหรือไม่ หรือพบข้อผิดพลาดในระหว่างการประเมินหรือไม่? ดู TripPin ส่วนที่ 7: สคีมาขั้นสูงพร้อม ชนิด M เพื่อการอภิปรายเกี่ยวกับการทดสอบหน่วย

การแปลงแบบไดนามิก

บางครั้งตรรกะที่ซับซ้อนมากขึ้นในการแปลงการตอบสนองของ API เป็นรูปแบบที่เสถียรและสอดคล้องกันที่เหมาะสมกับรูปแบบข้อมูล Power BI

การตอบสนอง API ที่ไม่สอดคล้องกัน

โฟลว์การควบคุม M พื้นฐาน (ถ้าเป็นรายงาน, โค้ดสถานะ HTTP, ลอง... บล็อกตรวจจับ และอื่น ๆ) มักเพียงพอในการจัดการสถานการณ์ที่มีวิธีในการตอบสนองของ API

การกําหนด Schema ใหม่

API บางตัวถูกออกแบบมาให้รวมข้อมูลหลายชิ้นเข้าด้วยกันเพื่อให้ได้รูปแบบตารางที่ถูกต้อง พิจารณาการตอบสนองจุด /sheets [สิ้นสุดของ]Smartsheet ซึ่งประกอบด้วยอาร์เรย์ของชื่อคอลัมน์และอาร์เรย์ของแถวข้อมูล ตัวเชื่อมต่อ Smartsheet สามารถแยกวิเคราะห์การตอบสนองนี้ด้วยวิธีต่อไปนี้:

raw = Web.Contents(...),
columns = raw[columns],
columnTitles = List.Transform(columns, each [title]),
columnTitlesWithRowNumber = List.InsertRange(columnTitles, 0, {"RowNumber"}),
                
RowAsList = (row) =>
    let
        listOfCells = row[cells],
        cellValuesList = List.Transform(listOfCells, each if Record.HasFields(_, "value") then [value]
                else null),
        rowNumberFirst = List.InsertRange(cellValuesList, 0, {row[rowNumber]})
    in
        rowNumberFirst,

listOfRows = List.Transform(raw[rows], each RowAsList(_)),
result = Table.FromRows(listOfRows, columnTitlesWithRowNumber)
  1. ข้อตกลงครั้งแรกกับข้อมูลส่วนหัวของคอลัมน์ คุณสามารถดึงระเบียน title ของแต่ละคอลัมน์ลงใน รายการ ซึ่งอยู่ก่อนด้วย RowNumber คอลัมน์ที่คุณทราบว่าจะแสดงเป็นคอลัมน์แรกนี้เสมอ
  2. ถัดไปคุณสามารถกําหนดฟังก์ชันที่ช่วยให้คุณสามารถแยกวิเคราะห์แถวลงในรายการของ value เซลล์ คุณสามารถเปิดข้อมูลไว้ล่วงหน้า rowNumber อีกครั้งได้
  3. ใช้ฟังก์ชัน RowAsList() ของคุณไปยังแต่ละรายการ row ที่ส่งกลับในการตอบสนอง API
  4. แปลง รายการ เป็นตาราง โดยระบุส่วนหัวของคอลัมน์