Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Untuk situasi di mana respons sumber data tidak disajikan dalam format yang bisa digunakan Power BI secara langsung, Power Query dapat digunakan untuk melakukan serangkaian transformasi.
Transformasi statis
Dalam kebanyakan kasus, sumber data menyajikan data dengan cara yang konsisten: nama kolom, jenis data, dan struktur hierarkis konsisten untuk titik akhir tertentu. Dalam situasi ini, adalah tepat untuk selalu menerapkan kumpulan transformasi yang sama untuk mendapatkan data dalam format yang dapat diterima oleh Power BI.
Contoh transformasi statis dapat ditemukan di TripPin Bagian 2 - Konektor Data untuk tutorial Layanan REST ketika sumber data diperlakukan sebagai layanan REST standar:
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
Transformasi dalam contoh ini adalah:
-
Sourceadalah Rekaman yang dikembalikan dari panggilan keTripPin.Feed(...). - Anda menarik nilai dari salah satu pasangan kunci-nilai
Source. Nama kuncinya adalahvalue, dan Anda menyimpan hasilnya dalam variabel yang disebutvalue. -
valueadalah daftar, yang Anda konversi ke tabel. Setiap elemen dalamvaluemenjadi baris dalam tabel, yang dapat Anda panggiltoTable. - Setiap elemen di
valueadalah Rekaman itu sendiri.toTablememiliki semua ini dalam satu kolom:"Column1". Langkah ini menarik semua data dengan kunci"AirlineCode"ke dalam kolom yang disebut"AirlineCode"dan semua data dengan kunci"Name"ke dalam kolom yang disebut"Name", untuk setiap baris ditoTable."Column1"digantikan oleh dua kolom baru ini.
Pada akhirnya, Anda memiliki data dalam format tabular sederhana yang dapat diolah dan dirender dengan mudah oleh Power BI.
Penting untuk dicatat bahwa urutan transformasi statis dari kekhususan ini hanya berlaku untuk satu titik akhir. Dalam contoh sebelumnya, urutan transformasi ini hanya berfungsi jika "AirlineCode" dan "Name" ada di respons titik akhir REST, karena dikodekan secara permanen ke dalam kode M. Dengan demikian, urutan transformasi ini mungkin tidak berfungsi jika Anda mencoba mengakses endpoint /Event.
Tingkat kekhususan tinggi ini mungkin diperlukan untuk mengirimkan data ke tabel navigasi. Tetapi untuk fungsi akses data yang lebih umum, kami sarankan Anda hanya melakukan transformasi yang sesuai untuk semua titik akhir.
Nota
Pastikan untuk menguji transformasi dalam berbagai keadaan data. Jika pengguna tidak memiliki data apa pun di /airlines titik akhir, apakah transformasi Anda menghasilkan tabel kosong dengan skema yang benar? Atau apakah terjadi kesalahan selama evaluasi? Lihat TripPin Bagian 7: Skema Tingkat Lanjut dengan Jenis M untuk diskusi tentang pengujian unit.
Transformasi Dinamis
Logika yang lebih kompleks terkadang diperlukan untuk mengonversi respons API menjadi bentuk yang stabil dan konsisten yang sesuai untuk model data Power BI.
Respons API yang tidak konsisten
Alur kontrol M Dasar (pernyataan if, kode status HTTP, blok try...catch, dan sebagainya) biasanya cukup untuk menangani situasi di mana API memiliki beberapa cara respons.
Menentukan Skema Secara Dinamis
Beberapa API dirancang sedih sehingga beberapa informasi harus digabungkan untuk mendapatkan format tabular yang benar. Pertimbangkan /sheets Smartsheet, yang berisi array nama kolom dan array baris data. Konektor Smartsheet dapat mengurai respons ini dengan cara berikut:
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)
- Pertama, memproses informasi header kolom. Anda dapat menarik catatan
titledari setiap kolom ke dalam daftar, dengan menambahkan kolomRowNumberyang Anda tahu selalu menjadi kolom pertama. - Selanjutnya Anda dapat menentukan fungsi yang memungkinkan Anda mengurai baris ke dalam Daftar sel
value. Anda dapat kembali menempatkan informasirowNumberdi awal. - Terapkan fungsi Anda
RowAsList()ke setiap elemenrowyang dikembalikan dalam respons API. - Konversi Daftar menjadi tabel, menentukan header kolom.