Clever-Excel-Forum

Normale Version: Power Query: was macht eigentlich List.Difference() ?
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo Ihr Wissenden,

gerade stellt PQ mir mal wieder Rätsel auf. Ich will aus einer Liste alle 0-en entfernen. Laut Beschreibung sollte das mit der Funktion List.Difference() möglich sein. Ist es bei mir aber nicht.

Wie im Screenshot zu sehen, liefert die Funktion aus einer Liste eine Menge an 0 als Ergebnis... warum??

Dabei wird die Liste erstellt aus einer Tabelle, in der die Einträge als Ergebnis von Rechnungen erstellt werden:
Code:
Vergleich = Table.AddColumn(#"Neu+Alt", "Vergleich", each if (Number.Abs(Number.From([DateiDatum]-[ModifyDateandTime]))>1/24/3600 or [Name]=null) then 1+0 else 1-1, Int8.Type)
Somit ist die Liste, die aus der hier erstellten Spalte Vergleich gebildet wird (List = Vergleich[Vergleich]), komplett mit Zahlen gefüllt. Trotzdem mag mir der List.Difference Befehl die Nullen nicht entfernen - Idee dazu?

Gruß und Dank,
RaiSta

Der Screenshot:[attachment=44875]
Zitat:Ich will aus einer Liste alle 0-en entfernen. Laut Beschreibung sollte das mit der Funktion List.Difference() möglich sein.
Das steht in der Doku aber nicht. 
Gibt die Elemente in Liste list1 zurück, die nicht in Liste list2 enthalten sind. Doppelte Werte werden unterstützt.

Teste 
Code:
List.Difference({0,0,0,0},{0})
List.Difference({0,0,0,0},{0,0})
Du suchst eher List.RemoveItems
Hättest du mal besser erklärt, was du eigentlich willst. 

Entweder alle Zeilen löschen, die in einer Spalte eine 0 enthalten, oder den Inhalt der betreffenden Zellen durch etwas anderes ersetzen?
(01.09.2022, 19:43)ws-53 schrieb: [ -> ]Hättest du mal besser erklärt, was du eigentlich willst. 

Entweder alle Zeilen löschen, die in einer Spalte eine 0 enthalten, oder den Inhalt der betreffenden Zellen durch etwas anderes ersetzen?

Hmmm, ursprünglich wollte ich im aktuellen Thema das Vorkommen aller '1' in der Vergleichsliste 'vgl' zählen. Da dachte ich mir, es kommen ja nur '1' und '0' vor --> die Anzahl aller '1' ist dann einfach die Summe der Spalte: List.Sum(vgl). Das brachte aber in schöner Regelmäßigkeit die Fehlermeldung, dass die Operation nicht auf 'null' angewandt werden könne.

Laut Konstruktion können da gar keine 'null'- Werte auftreten ... aber, wer weiß, was in 12000 Zeilen alles so an Unmöglichkeiten drin steht, also habe ich auf verschiedene Weisen versucht, 'null' zu entfernen ... ohne Erfolg. Bis ich schließlich auf die Idee kam, in der Liste 'vgl' halt alle '0' und alle 'null' zu entfernen, um danach die Anzahl übrig gebliebener Zeilen zu zählen. Damit erzielte ich aber auch keinen Erfolg, sondern es traten immer irgendwelche rätselhafte Meldungen auf.

Somit kam ich dann in's Forum mit meiner Frage - und jetzt vermute ich, dass PQ einfach mit derart umfangreichen Listen nicht umgehen kann, sodass es hier zu merkwürdigen Meldungen kommt, die aber wohl internen Grenzen bei PQ geschuldet sind. Das ist meine derzeitige Erklärung - vielleicht hat ja jemand eine bessere ... ?

Gruß und Dank
RaiSta
Zitat:vielleicht hat ja jemand eine bessere ... ?
Ja, aber die willst Du nicht hören
Code:
= List.Count(List.Select ({1,2,3,4,1,3,2,4,0,9,0}, each _ = 1))
(01.09.2022, 19:15)DeltaX schrieb: [ -> ]Das steht in der Doku aber nicht. 
Gibt die Elemente in Liste list1 zurück, die nicht in Liste list2 enthalten sind. Doppelte Werte werden unterstützt.
[...]
Du suchst eher List.RemoveItems

Hmmm, eine Antwort hatte ich schon geschrieben, scheint aber verschwunden zu sein...?

Jedenfalls Danke für den Hinweis auf List.RemoveItems! Diese Funktion bietet das, was ich mit List.Difference erreichen wollte! Wobei ich die Beschreibung zu List.Difference(List1, List2) dann nicht ganz verstehe (hast Du ja zitiert). Aber offenbar entfernt List.Difference nur das erste Vorkommen von Elementen aus List2 in List1 ... oder? Was verstehe ich da falsch?

Nichts desto trotz scheitert aber auch List.RemoveItems an meiner konkreten Aufgabenstellung: nach Eingabe des Befehls erscheint erst für ne ganze Weile das Windows-Rad (früher war das die Sanduhr...), dann steht da plötzlich lapidar 'Error'. Ein Klick neben Error lässt das Rad wieder lange kreiseln, bevor schließlich eine einfache '1' erscheint. Keine Erklärung des 'Errors' oder was auch immer --> offenbar ist PQ mit 12000 Einträgen in einer Liste überfordert (auch wenn nur 1 oder 0 drin steht). Na ja, dann muss ich mir was anderes überlegen...

Danke für den Hinweis, auch wenn dabei meine Fragen nicht wirklich weniger wurden ... aber anders wurden sie ... 

Gruß und Dank,
RaiSta
Zitat:Aber offenbar entfernt List.Difference nur das erste Vorkommen von Elementen aus List2 in List1 ... oder? Was verstehe ich da falsch?
Ja, Du verstehst das falsch.

Mit 12.000 Einträgen in einer Liste ist Powerquery nicht überfordert. Mir scheint, die Überforderung liegt woanders. Aber Du musst schon mehr Infos und eine Beispieldatei liefern, so kommen wir nicht weiter.
(01.09.2022, 20:45)DeltaX schrieb: [ -> ]Ja, aber die willst Du nicht hören
Code:
= List.Count(List.Select ({1,2,3,4,1,3,2,4,0,9,0}, each _ = 1))

Na ja, als Lösungsansatz durchaus einen Versuch wert, aber meine Frage bezog sich mehr darauf, warum PQ kein 'vernünftiges' Ergebnis liefert. Die Vermutung war, dass es mit >12000 Einträgen schlicht überfordert sei - oder ob es _dazu_ bessere Erklärungen gibt.

Nichts desto trotz habe ich Deinen Vorschlag mal umgesetzt. Das Ergebnis ist in den Screenshots anzusehen:
a) zur Zeilenzahl:[attachment=44882]
b) Ergebnis der Formel: [attachment=44883]

Also scheitert PQ auch mit dieser Formel ... an der Zahl der Elemente?

Gruß und Dank,
RaiSta
Schöne Bilder
Zitat:Also scheitert PQ auch mit dieser Formel ... an der Zahl der Elemente?
Die Fehlermeldung ist doch eindeutig. Du willst die Anzahlder Listelemete zählen, die die Zahl 1 enthalten. Somit handelt e sich um eine numerische Zählung. Die Liste enthält aber wohl auch Initialwerte (null), die nicht numerisch sind und somit beiZählung numerischer Werte zum Fehler führen. Wenn du vorher die Inhalte der Liste als Text definierst und dann zählst, wie oft der Text "1" in der Liste enthalten ist, dann sollte es keine Probleme geben.
Seiten: 1 2