PowerQuery: Tabellenzeilen selektieren, Auswahlkriterium ist Liste
#1
Hallo Ihr Wissenden,

stehe gerade auf'm Schlauch, bräuchte mal ne fixe Idee:
  • ich habe eine Tabelle, in der in der Spalte "Name" die Namen von Unterverzeichnissen eines Ordners stehen
  • diese Verzeichnisnamen enthalten u.a. eine Jahreszahl
  • außerdem habe ich eine Liste mit Jahreszahlen (als Zahlen)
nun möchte ich aus der Tabelle alle Zeilen selektieren, die im Namen des Unterverzeichnisses eine der Zahlen in der Liste enthalten.

Welche Struktur ist dafür um geeignetsten?

Ich kann natürlich jede der Zeilen der Tabelle mit 'or' fix auf jedes der Elemente der Liste prüfen - aber damit fixiere ich die Anzahl zu prüfender Zahlen.

Welche geschickte Konstruktion ermöglicht mir hier, bei variabler Anzahl an Zahlen in meiner Selektionsliste trotzdem alle Zeilen meiner Tabelle auszuwählen, die in der 'Name'-Spalte eine der Zahlen enthalten?

Zur Visualisierung ein Beispiel einer Tabelle mit Verzeichnissen:
   
Und hier ein Beispiel einer Liste mit Jahreszahlen:
   
Im Beispiel möchte ich in der Tabelle alle Zeilen auswählen, die entweder die Zahl '2023', die Zahl '2022' oder die Zahl '2021' enthalten.

Gruß und Dank,
RaiSta
 Man(n) ist nie zu alt für die Erkenntnis, dass das bisher Gelernte doch nur bedingt gültig oder auch nur brauchbar ist. 27
Antworten Top
#2
Hi Raista,

mal ein Beispiel...
ich gehe davon aus, dass Du die Jahreszahlen aus der Spalte Name vergleichen willst. In meinem Bsp. ist es die Spalte b... :)

Somit als erstes, eine neue Spalte mit der extrahierten Jahreszahl aus Name (im Bsp.  JahreszahlAusSpalte_b)
dann eine Tabelle aus der Liste der Jahreszahlen ( Jahresliste)
dann die beiden kombinieren ( #"Zusammengeführte Abfragen" )
und aus der extrahierten Spalte die Nullen rausfiltern...

Optische Aufräumarbeiten überlasse ich jetzt Dir...  Sleepy


let
    Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
    //Tabelle aus Liste mit 3 Jahreszahlen erstellen
    Jahresliste = Table.FromList(  {"2020","2021","2022"}),
    JahreszahlAusSpalte_b = Table.AddColumn(Quelle, "NurJahreszahl", each Text.End([b],4)),
    #"Zusammengeführte Abfragen" = Table.NestedJoin(JahreszahlAusSpalte_b, {"NurJahreszahl"}, Jahresliste, {"Column1"}, "JahreszahlAusSpalte_b", JoinKind.LeftOuter),
    #"Erweiterte JahreszahlAusSpalte_b" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "JahreszahlAusSpalte_b", {"Column1"}, {"JahreszahlAusSpalte_b.Column1"}),
    #"Gefilterte Zeilen" = Table.SelectRows(#"Erweiterte JahreszahlAusSpalte_b", each ([JahreszahlAusSpalte_b.Column1] <> null))
in
    #"Gefilterte Zeilen"
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#3
(09.03.2023, 21:17)Ralf A schrieb: ich gehe davon aus, dass Du die Jahreszahlen aus der Spalte Name vergleichen willst. In meinem Bsp. ist es die Spalte b... :)

Somit als erstes, eine neue Spalte mit der extrahierten Jahreszahl aus Name (im Bsp.  JahreszahlAusSpalte_b)

Hallo Ralf,

danke für Deinen Lösungsvorschlag. Daran merke ich, dass ich mein Thema nicht vollständig beschrieben hatte...

Das Problem ist, dass ich nicht fix davon ausgehen kann, dass in den Namen der Unterverzeichnisse als Letztes immer die Jahreszahl steht - da könnte auch mal 2022-a oder 2022_01 oder 2022|Q2 oder ... oder ... stehen (dem Ideenreichtum der Verzeichnis-Erzeuger sind keine Grenzen gesetzt....).

Daher wollte ich explizit nur abprüfen, ob eine der Zahlen aus der Zahlenliste in der Spalte Name der Tabelle enthalten ist. Da sehe ich erst mal keine direkte Chance für einen Join...?

Gruß und Dank,
RaiSta
 Man(n) ist nie zu alt für die Erkenntnis, dass das bisher Gelernte doch nur bedingt gültig oder auch nur brauchbar ist. 27
Antworten Top
#4
Hi

zwei Varianten.

Gruß Elex


Angehängte Dateien
.xlsx   Nur Teiltexte finden.xlsx (Größe: 22,33 KB / Downloads: 10)
[-] Folgende(r) 2 Nutzer sagen Danke an Elex für diesen Beitrag:
  • Ralf A, RaiSta
Antworten Top
#5
(10.03.2023, 09:17)RaiSta schrieb: Das Problem ist, dass ich nicht fix davon ausgehen kann, dass in den Namen der Unterverzeichnisse als Letztes immer die Jahreszahl steht - da könnte auch mal 2022-a oder 2022_01 oder 2022|Q2 oder ... oder ... stehen (dem Ideenreichtum der Verzeichnis-Erzeuger sind keine Grenzen gesetzt....).

...sorry... ich bin davon ausgegangen, dass das Problem die Liste wäre...

@Elex,

wie geil ist das denn? Damit meinte ich die Funktionslösung.  28
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#6
(10.03.2023, 11:49)Ralf A schrieb: @Elex,

wie geil ist das denn? Damit meinte ich die Funktionslösung.  28

Dem kann ich mich nur anschließen. Diese Lösungen sind genau das, was ich mir erhofft hatte. Jetzt muss ich's nur noch verstehen...

Also die Variante 1 kann ich gut nachvollziehen. Aber - Funktion V1 ist für mich dann doch noch ein bisschen ein Rätsel – da muss ich jetzt erst mal noch 'ne Weile 'dran kauen.

Richtig geile Geschichte zum Wochenende - jetzt gibt's noch was für die grauen Zellen, damit die nicht einrosten!

Vielen Dank, @Elex,
hier bringst Du mich weiter!


Ein erstes Teilergebnis ist eine Reduktion der Funktionszeile:
Mit der Tabelle Deines Beispiels "tblData" sowie des Filters "tblFilter":
       –       
Code:
let
    Source = Excel.CurrentWorkbook(){[Name="tblData"]}[Content],
    nurGültige = Table.SelectRows(Source,
        (x) => List.MatchesAny(tblFilter[Filter], each Text.Contains(x[Name], _))
        )
       
in
    nurGültige

Liefert das selbe Ergebnis ohne noch die Kapselung im "if ... then ... else".

... ich pirsche mich an – an's Verstehen...

RaiSta
 Man(n) ist nie zu alt für die Erkenntnis, dass das bisher Gelernte doch nur bedingt gültig oder auch nur brauchbar ist. 27
Antworten Top
#7
Hallo

Nach den Funktionensbeschreibungen hatte ich eigentlich erwartet dass es auch so reicht. Geht aber nicht.
Table.SelectRows(Quelle, List.MatchesAny(tblFilter[Filter], each Text.Contains([Name], _)))
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste