การจัดการการเปลี่ยนแปลง

สําหรับสถานการณ์ที่การตอบสนองของแหล่งข้อมูลไม่ได้แสดงในรูปแบบที่ 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 สามารถใช้และแสดงผลได้อย่างง่ายดาย:

ภาพหน้าจอของข้อมูลในรูปแบบตาราง

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

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

Note

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

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

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

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

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

การกําหนด Schema On-The-Fly

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. ถัดไปคุณสามารถกําหนดฟังก์ชันที่ช่วยให้คุณสามารถแยกวิเคราะห์แถวเป็นรายการเซลล์ values คุณสามารถเพิ่ม rowNumber ข้อมูลล่วงหน้าได้อีกครั้ง
  3. ใช้ฟังก์ชันของคุณ RowAsList() กับแต่ละ rows ที่ส่งคืนในการตอบกลับ API
  4. แปลงรายการเป็นตาราง โดยระบุส่วนหัวของคอลัมน์