Ersetzung von bedingten Werte in einer Spalte in Power Query in einem Schritt

April 2, 2023
Denis Selimovic
Power Query / Mcomment 3Created with Sketch Beta.0 comments

This post is also available in: Englisch

Wenn man viel mit Power Query arbeitet, muss man früher oder später Werte in einer Spalte ersetzen, die auf bestimmten Bedingungen basieren.

Leider gibt es dafür keinen eigenen Schritt im Power Query Editor. Normalerweise muss man eine bedingte Spalte hinzufügen, dann die alte Spalte entfernen, die neu erstellte Spalte umbenennen und an die Stelle der ursprünglichen Spalte verschieben, wenn man die Reihenfolge beibehalten will. Das funktioniert zwar einwandfrei, aber wenn man viel mit Power Query arbeitet, möchte man die zusätzlichen Schritte eigentlich vermeiden und die Transformation in einem einzigen Schritt durchführen. In diesem Artikel erkläre ich, wie man in Power Query in einem Schritt eine bedingte Ersetzung von Werten in einer Spalte vornehmen kann.

Eine normale Ersetzung als Platzhalter verwenden

In unserem Fall möchte ich den Produktnamen in eine Kategoriespalte umwandeln und jedes Produkt, welches “bike” enthält, durch die Kategorie “Bike” ersetzen. Alle Produkte, die nicht den Begriff “Bike” enthalten, sollten als “Accessory” deklariert werden. Dieses Szenario kennst du vielleicht noch aus dem Artikel von vor ein paar Wochen, in dem ich überprüfen wollte, ob eine Spalte einen bestimmten Text in DAX enthält.

Um mir das Leben zu erleichtern, erstelle ich einen normalen Schritt “Werte ersetzen” in Power Query und gebe einfach zwei Dummy-Werte ein:

Erstellen Sie einen Schritt "Werte ersetzen". Diesen statischen Schritt werden wir später dynamisch gestalten.
Erstellen Sie einen Schritt “Werte ersetzen”. Diesen statischen Schritt werden wir später dynamisch gestalten.

Dieser Dummy-Schritt würde den statischen Text “FindValue” durch den statischen Text “ReplaceValue” ersetzen:

Verwenden eines statischen Dummy-Wertes, den wir später dynamisch machen werden
Verwenden eines statischen Dummy-Wertes, den wir später dynamisch machen werden

Dieser Dialog wird die Funktion Table.ReplaceValue verwenden. Im nächsten Schritt werden wir dies dynamisch gestalten.

Ersetzen Sie den statischen Suchtext durch einen dynamischen

Zunächst wird der statische Text, nach dem wir suchen, durch den dynamischen Wert der aktuellen Zeile ersetzt. Dazu müssen wir ein “each” und den Spaltennamen hinzufügen. Die folgende Aufnahme zeigt, wie alle Werte sofort in den “ReplaceValue” geändert werden:

Dynamische Erstellung des "SearchValue" in Power Query
Dynamische Erstellung des “SearchValue” in Power Query

Hier ist die Formel für den letzten Schritt:

= Table.ReplaceValue(#"Changed Type", each [Product Name],"ReplaceValue",Replacer.ReplaceText,{"Product Name"})

Übrigens, falls die Symbolleiste nicht angezeigt wird, kann man die Symbolleiste unter “Ansicht” einblenden und dann die “Symbolleiste” aktivieren:

image 25

Den statischen Text durch die bedingte Formel ersetzen

Im Moment haben wir den statischen “SearchValue” durch den dynamischen Wert jeder Zeile ersetzt. Nun müssen wir dasselbe für den “ReplaceValue” der Formel tun.

Hier können Sie jeden bedingten Vergleich verwenden, den Sie wollen. Entweder weiß man, wie man M-Abfragen in Power Query schreibt, oder man kann die grafische Schnittstelle für bedingte Spalten verwenden und dann einfach den Code kopieren. Hier habe ich die grafische Oberfläche verwendet, um eine neue bedingte Spalte zu erstellen:

Hinzufügen einer bedingten Spalte zur Erstellung des M-Codes
Hinzufügen einer bedingten Spalte zur Erstellung des M-Codes

Und dann habe ich diese Formel für den “ReplaceValue” in unserem Ersetzen-Ansatz verwendet. In meinem Fall habe ich die Formel einfach eingetippt, aber ich hätte sie auch aus dem letzten Beispiel kopieren können. Man kann für jeden Parameter eine neue Spalte verwenden, was das Verständnis des Codes etwas erleichtert:

Ersetzen des statischen "ReplaceValue" durch eine bedingte Funktion
Ersetzen des statischen “ReplaceValue” durch eine bedingte Funktion

Anschließend wurde der Wert durch die Kategorie ersetzt, die wir in unserem Code definiert haben.

Der vollständige Code des letzten Schrittes lautet wie folgt:

= Table.ReplaceValue(#"Changed Type", 
each [Product Name],
each if Text.Contains( [Product Name], "bike") then "Bike" else "Accessory",
Replacer.ReplaceText,{"Product Name"})

Zusammenfassung

Wir haben gesehen, wie einfach es sein kann, Werte in einer Spalte in einem einzigen Schritt dynamisch zu ersetzen. Je öfter man das tut, desto einfacher wird es. Und man hat nur einen zusätzlichen Schritt in Power Query, statt wie bisher drei Schritte.

Ich persönlich verwende diesen Ansatz recht häufig und ich hoffe, dass er auch dein Leben mit Power Query ein wenig einfacher und sauberer macht. Wenn du irgendwelche Kommentare oder Gedanken dazu hast, lass es mich einfach in den Kommentaren wissen.

Beispieldatei herunterladen

Die Datei, die ich für diesen Artikel verwendet habe, kann über den folgenden Link heruntergeladen werden: