Wenn man Tabellen in Power Query anfügen möchte, dann kann es vorkommen, dass alle Tabellen zwar dieselbe Struktur aufweisen, bei einigen Tabellen die Spaltenbeschriftungen jedoch Unterschiede in der Groß- und Kleinschreibung aufweisen. Da Power Query case sensitiv ist, also Groß- und Kleinschreibung beachtet, führt dies zu unerwünschten Ergebnissen. Ich zeige Dir im heutigen Beitrag, wie Du mit Power Query Tabellen mit unterschiedlich geschriebenen Überschriften anfügst.
Als Abonnent meines Newsletters erhältst Du die Beispieldateien zu den Beiträgen dazu. Hier geht’s zum geht’s zum Abonnement des Newsletters!
Groß- und Kleinschreibung beim Anfügen mit Power Query
Ich bin in meinen beiden letzten Beiträgen Unterschiedliche Datenstrukturen mittels Power Query anfügen und Anfügetabellen mit Power Query automatisch an die Strukturtabelle anpassen bereits auf gängige Problemstellungen beim Anfügen von Tabellen mit Power Query eingegangen. Eine wichtige Information bzgl. des Anfügens von Tabellen in Power Query war, dass Power Query diejenigen Spalten aneinander anfügt, die dieselbe Spaltenbezeichnung haben. Hierbei ist zu beachten, dass Power Query case sensitiv ist und somit zwischen Groß- und Kleinschreibung von Buchstaben unterscheidet. Die unterschiedlich geschriebenen Spalten führen dazu, dass sie als zwei unterschiedliche Spalten erkannt und nicht aneinander angefügt werden. Stattdessen wird für jede dieser (in diesem Falle) kleingeschriebenen Spalten eine neue Spalte in der Ergebnistabelle angefügt.
Dies automatisiert und nachhaltig zu verändern, ist Gegenstand dieses Beitrags.
Die Idee: Alle Spaltenbezeichnungen der Anfügetabelle groß schreiben
Meine Strukturtabelle (auf dessen Bedeutung ich in meinen beiden vorherigen Beiträgen zu dieser Reihe detailliert eingegangen bin) hat ausschließlich Großbuchstaben als Spaltenbezeichnung. Wenn die Kleinschreibung einer Spaltenbezeichnung der Anfügetabelle dazu führt, dass sie als neue Spalte interpretiert wird, liegt die Idee nahe, einfach alle Spalten der Anfügetabellen vor dem Anfügeprozess in Großbuchstaben umzuwandeln.
Dies würde für meinen gegenwärtigen Fall zur gewünschten Struktur der Ergebnistabelle führen. Ich möchte die Großschreibung aller Spalten einer Anfügetabelle jedoch nicht manuell vornehmen. Stattdessen möchte ich die Großschreibung aller Spaltenüberschriften automatisieren und auf etwaige Veränderungen der Anfügetabelle vorbereiten.
Spaltenüberschriften automatisiert umbenennen
Um den Umbenennungsprozess zu automatisieren schaue ich mir zunächst an, was Power Query intern eigentlich macht, wenn ich eine Spalte manuell umbenenne.
Klicke ich doppelt in den Spaltenkopf der Spalte „b“ und benenne diese in „B“ um, so erzeugt Power Query einen neuen Schritt („Umbenannte Spalten“). Dieser Schritt beinhaltet die Funktion Table.RenameColumns (hier geht’s zur Online-Dokumentation von Table.RenameColumns). Diese Funktion hat zwei Parameter:
- Tabelle als Tabelle: Im ersten Parameter wird der Funktion mitgegeben, auf Basis welcher Tabelle Umbenennungen von Spalten vorgenommen werden sollen. In meinem Falle ist dies die Tabelle „Geänderter Typ“, also der zweite meiner angewendeten Schritte in dieser Abfrage. Schritte in Power Query geben zumeist (nicht immer!!) Tabellen zurück, so dass ein Schritt als Tabellenangabe genutzt werden kann.
- Umbenennung als Listen: Dieser Parameter ist vom Typ List (engl. für Liste) und wendet die Umbenennung im Format {alt, neu} an. In meinem Beispiel bedeutet {{„b“, „B“}}, dass „b“ in „B“ umbenannt wird. Auf das Konzept der Listen gehe ich später detaillierter ein.
Da ich nicht alle Spaltenbezeichnungen manuell per Doppelklick umbenennen möchte, suche ich nach einer Möglichkeit mir dynamisch eine Liste von groß geschriebenen Spaltenbezeichnungen zu erzeugen, um sie als zweiten Parameter in der Funktion Table.RenameColumns() zu benutzen.
So erzeugst Du eine dynamische Liste gewünschter Spaltenbezeichnungen
Wie eben beschrieben möchte ich den zweiten Parameter der Funktion Table.RenameColumns() gerne dynamisch ermitteln und nicht jedes Mal durch einen Doppelklick auf die entsprechende Spalte manuell erzeugen müssen. Wie dies funktioniert, erläutere ich in den nächsten Schritten.
Die Anfügetabelle erneut in Power Query importieren
Um mir eine dynamische Liste für die gewünschten Überschriftenbezeichnungen zu erzeugen, importiere ich die Anfügetabelle erneut in Power Query.
Ich nenne diese Abfrage Uebersetzungsliste. Nun lasse ich mir im nächsten Schritt die Überschriften der Abfrage als Liste zurückgeben.
Eine Liste mit den Namen der Spaltenbezeichnungen erstellen
Um die Überschriften der Tabelle in eine Liste einzulesen, nutze ich die Funktion Table.ColumnNames(). Die folgende Animation zeigt wie.
Das Ergebnis der Funktion Table.ColumnNames() ist eine Liste (und keine Tabelle). Da wird an die eine existierende Spalte zwei weitere Spalten anfügen wollen und dies mit einer Liste nicht funktioniert, muss ich diese Liste zunächst in eine Tabelle konvertieren.
Da ich nun eine Tabelle mit den Ist-Spaltenbezeichnungen vorliegen habe, kann ich jetzt eine weitere Spalte hinzufügen, die die gewünschten Spaltenbezeichnungen enthalten wird.
Eine Spalte mit gewünschten Spaltenbezeichnungen hinzufügen
Ich benenne die bestehende Spalte Column1 zuerst um in alt. Danach erzeuge ich eine neue Spalte mit der Bezeichnung neu. Der Inhalt der neuen Spalte wird durch die Formel Text.Upper([alt]) bestimmt. Diese wandelt den Inhalt der Spalte alt um in Großbuchstaben. Den Ablauf zeigt folgende Abbildung im Detail.
Das Ziel ist immer noch eine Liste mit der Übersetzung der Ist-Spaltenbezeichnung zur Soll-Spaltenbezeichnung. Hierfür erzeuge ich nun eine dritte Spalte, die beide Informationen in sich vereint.
Eine weitere Spalte erzeugen, die Ist- und Soll-Spaltenbezeichnung enthält
Um an die oben erwähnte Funktion Table.RenameColumns eine Übersetzungsliste übergeben zu können, muss ich zunächst eine Spalte hinzufügen, die sowohl die Ist- als auch die Soll-Spaltenbezeichnung beinhaltet. Die folgende Animation zeigt, wie ich das mache.
Mit dieser neuen Spalte habe ich pro Zeile die alte und die neue Spaltenbezeichnung in Listenform errstellt. In jeder Zelle der Spalte Uebersetzung befindet sich eine Liste. Um jedoch diese komplette Abfrage als Parameter in der Funktion Table.RenameColumns nutzen zu können, muss ich aus der kompletten Abfrage Uebersetzungsliste eine Liste machen. Damit erzeuge ich dann eine Liste von Listen (ich weiß, das ist nicht ganz trivial). Dies geschieht wie folgt.
Indem ich einen neuen Schritt einfüge und den Namen der gewünschten Spalte (Uebersetzung) in eckigen Klammern dahinter setze, entsteht eine neue Liste. Da ich bereits in jeder Zelle der Spalte Uebersetzung je eine Liste hatte, habe ich nun also eine Liste von Listen. Dies ist im Wesentlichen durch zwei Merkmale offensichtlich:
- Nach der Bestätigung der Formel mit Enter werden alle anderen Spalten entfernt und die Spaltenbezeichnung wechselt von Uebersetzung auf List.
- Wie in der folgenden Abbildung ersichtlich ist, wechselt auch das Icon im Abfragenfenster von Tabelle auf Liste.
Damit bin ich soweit, dass ich die erstellte Liste nutzen kann, um in meiner Anfügetabelle die Umbenennung der Spaltenbezeichnungen dynamisch vorzunehmen.
Die erstellte Übersetzungsliste zum Umbenennen der Spaltenbezeichnungen nutzen
Nochmal kurz zur Erinnerung. Ich habe diese Liste zu einem einzigen Zweck erstellt. Sie soll als zweiter Parameter in der Funktion Table.RenameColumns() die Übersetzung von alter Spaltenbezeichnung zur neuen Spaltenbezeichnung übernehmen.
Ich setze also an die Stelle des rot markierten Bereiches nun den Namen meiner erstellten Liste Uebersetzungsliste.
Das Ergebnis ist wie gewünscht. Die beiden Spalten b und d wurden in B und D umbenannt. Sofern also ein Anfügen an die Strukturtabelle bisher an der Groß- und Kleinschreibung der Spaltenbezeichnungen in den Anfügetabellen gehapert haben sollte, kann ich dies nun für die Zukunft ausschließen. Da die Uebersetzungsliste auf derselben Datenbasis aufsetzt wie die Anfügetabelle, ist sichergstellt, dass bei einer Änderung der Anfügetabelle auch die Uebersetzungsliste aktuell bleibt. Was an dieser Stelle jedoch klar sein muss ist, dass dieses Verfahren bei mehreren Anfügetabellen auch mehrfach ausgeführt werden muss. Hier kann das Erstellen einer benutzerdefinierten Funktion Abhilfe schaffen. Doch das wird Bestandteil eines anderen Beitrags.
Bis zum nächsten Mal und denk dran: Sharing is caring. Wenn Dir der Beitrag gefallen hat, dann teile ihn gerne 🙂
Viele Grüße aus Hamburg,
Lars
Lars ist Berater, Entwickler und Trainer für Microsoft Power BI. Er ist zertifizierter Power BI-Experte und Microsoft Trainer. Für sein Engagement in der internationalen Community wurde Lars seit 2017 jährlich durch Microsoft der MVP-Award verliehen. Lies hier mehr…
Hartmut meint
Geht das nicht einfacher mit einer einzigen Zeile…
SpaltenNamenUpper = Table.TransformColumnNames(#“PrevStep“, each Text.Upper(_))
Lars Schreiber meint
Hallo Hartmut,
wenn die Unterschiede zwischen den Spaltenbezeichnungen wirklich nur in Groß- und Kleinschreibung besteht, dann hast Du vollkommen recht. Das würde ich heute auch anders lösen, als vor 3 Jahren. Falls die Unterschiede jedoch komplexer sind, ist die Übersetzungsliste trotzdem sinnvoll, auch wenn der neue Spaltenname dann natürlich anders ermittelt werden muss.
Danke und viele Grüße,
Lars