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

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

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

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

ตัวอย่างของการแปลงแบบคงที่สามารถพบได้ใน TripPin Part 2 - เชื่อมต่อ or ข้อมูลสําหรับบทช่วยสอนบริการ 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 สามารถใช้และแสดงได้อย่างง่ายดาย:

Data in tabular form.

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

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

หมายเหตุ

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

การแปลงข้อมูลแบบไดนามิก

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

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

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

การกําหนดสคีมาในทันที

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