Bemærk
Adgang til denne side kræver godkendelse. Du kan prøve at logge på eller ændre mapper.
Adgang til denne side kræver godkendelse. Du kan prøve at ændre mapper.
I situationer, hvor datakildesvaret ikke præsenteres i et format, som Power BI kan bruge direkte, kan Power Query bruges til at udføre en række transformationer.
Statiske transformationer
I de fleste tilfælde præsenterer datakilden dataene på en ensartet måde: kolonnenavne, datatyper og hierarkisk struktur er konsistente for et bestemt slutpunkt. I denne situation er det hensigtsmæssigt altid at anvende det samme sæt transformationer for at hente dataene i et format, der er acceptabelt for Power BI.
Du kan finde et eksempel på statisk transformation i selvstudiet TripPin Part 2 – Data Connector for en REST Service , når datakilden behandles som en standard REST-tjeneste:
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
Transformationerne i dette eksempel er:
-
Sourceer en post, der returneres fra et opkald tilTripPin.Feed(...). - Du trækker værdien fra et af
Source's nøgleværdipar. Navnet på nøglen ervalue, og du gemmer resultatet i en variabel kaldetvalue. -
valueer en liste, som du konverterer til en tabel. Hvert element ivaluebliver til en række i tabellen, som du kan kaldetoTable. - Hvert element er i
valuesig selv en optegnelse.toTablehar alle disse i en enkelt kolonne:"Column1". Dette trin trækker alle data med nøgle"AirlineCode"ind i en kolonne kaldet"AirlineCode"og alle data med nøgle"Name"til en kolonne kaldet"Name", for hver række itoTable."Column1"erstattes af disse to nye kolonner.
Når dagen er omme, står du tilbage med data i et simpelt tabelformat, som Power BI kan bruge og nemt gengive:
Det er vigtigt at bemærke, at en sekvens af statiske transformationer af denne specificitet kun gælder for et enkelt slutpunkt. I det forrige eksempel fungerer denne sekvens af transformationer kun, hvis "AirlineCode" og "Name" findes i REST-slutpunktssvaret, da de er hårdkodet i M-koden. Derfor fungerer denne sekvens af transformationer muligvis ikke, hvis du forsøger at ramme slutpunktet /Event .
Dette høje niveau af specificitet kan være nødvendigt for at overføre data til en navigationstabel. Men for mere generelle dataadgangsfunktioner anbefaler vi, at du kun udfører transformationer, der er relevante for alle slutpunkter.
Notat
Sørg for at teste transformationer under forskellige dataomstændigheder. Hvis brugeren ikke har nogen data på slutpunktet /airlines , resulterer dine transformationer så i en tom tabel med det korrekte skema? Eller opstår der en fejl under evalueringen? Se TripPin del 7: Avanceret skema med M-typer for en diskussion om enhedstest.
Dynamiske transformationer
Nogle gange er der behov for mere kompleks logik for at konvertere API-svar til stabile og konsistente formularer, der er relevante for Power BI-datamodeller.
Inkonsekvente API-svar
Grundlæggende M-kontrolflow (hvis sætninger, HTTP-statuskoder, prøve... catch blocks osv.) er typisk tilstrækkelige til at håndtere situationer, hvor der er en håndfuld måder, hvorpå API'en reagerer.
Bestemmelse af skema påThe-Fly
Nogle API'er er designet således, at flere oplysninger skal kombineres for at få det korrekte tabelformat. Overvej Smartsheets /sheets, som indeholder en matrix af kolonnenavne og en matrix af datarækker. Smartsheet Connector er i stand til at analysere dette svar på følgende måde:
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)
- Først skal du håndtere kolonneoverskriftsoplysninger. Du kan trække posten
titlefor hver kolonne ind i en liste og indlede med enRowNumberkolonne, som du ved altid er repræsenteret som denne første kolonne. - Dernæst kan du definere en funktion, der giver dig mulighed for at fortolke en række til en liste over celler
values. Du kan igen sætterowNumberoplysninger foran. - Anvend din
RowAsList()funktion på hver af derows, der returneres i API-svaret. - Konverter listen til en tabel, og angiv kolonneoverskrifterne.