Leider führt das zu einer Fehlermeldung "Expression.Error: Unbekannter Bezeichner. Haben Sie die Kurznotation "[field]" für "_[field]" außerhalb eines each-Ausdrucks verwendet?" Gibt es eine Lösung für diese Aufgabe? Die Tabelle sieht wie folgt aus:
, die erste Zelle in der Spalte 'TrennList' enthält:
2023-10-20_09h08_12.png (Größe: 445 Bytes / Downloads: 159)
- überall genau zwei Werte: 0 und die Zahl aus der Spalte 'Position'.
Man(n) ist nie zu alt für die Erkenntnis, dass das bisher Gelernte doch nur bedingt gültig oder auch nur brauchbar ist.
bei 'Table.SplitColumn(...)' und 'Splitter.SplitTextByPositions(...)'und hast Du keine Möglichkeit, auf andere Spalten der selben Zeile (Record) zuzugreifen, denn es fehlt das, was ja in der gezeigten Fehlermeldung bemängelt wird: fehlendes 'each' bzw. '(_)=>'. Ich habe da Einiges probiert, selbst das Auslagern in eine Funktion kann da nicht helfen, denn es ist nicht möglich, das fehlende 'each' irgendwie einzubauen. Es wird eine statische [Trennlist] erwartet, so daß alle Werte der selben Spalte nach dem selben Muster getrennt werden.
24.10.2023, 10:17 (Dieser Beitrag wurde zuletzt bearbeitet: 24.10.2023, 10:22 von ws-53.)
Auch der Versuch, die Positionsliste innerhalb einer Funktion, somit jeweils nur für den aktuellen Datensatz, zu erstellen, hat nicht zum Ziel geführt. Mit der Abfrage "Dynamischer Splitt" habe ich dann aber doch eine Lösung gefunden, die zwar nicht ganz so elegant ist, aber mit meinen Testdaten funktioniert. Sofern es merhr als 10 Spalten werden können. muss die Abfrage entsprechend erweitert werden.
Meine anderen Versuche sind noch in der Mappe enthalten. Habe eben erst die Bilder gesehen.
Ginge eigentlich auch zuerst bei "~" und dann bei dem Ersten Leerzeichen zu trennen.
habe auf der Grundlage Deiner PQ-Beispieldatei ein bißchen Feinkosmetik betrieben. Manchmal ist es schwieriger, einen guten Leitfaden für das Problem zu finden, als dann an einer vorgefertigten Lösung herumzudoktern, so wie in meinem Fall - Danke für den starken Lösungsansatz und
25.10.2023, 10:43 (Dieser Beitrag wurde zuletzt bearbeitet: 25.10.2023, 11:00 von ws-53.)
Hallo Luschi,
ja ich war davon ausgegangen, dass du mit meinem Ansatz eine Lösung finden wirst. Ebenso hatte ich befürchtet, dass die Lösung für mich dann nicht in Gänze nachvollziehbar sein wird.
Aber folgendes konnte ich feststellen:
Wenn das Ergebnis der Abfrage "Dynamischer_Split_Luschi" als Verbindung geladen und aus dieser dann die Tabelle geladen wird, dann kann "Import_Data" als normale Abfrage angelegt sein.
In der Abfrage "Dynamischer_Split_Luschi" scheint der Schritt "Datentyp der neuen Spalten festlegen" nicht notwendig zu sein, denn es läuft auch ohne diesen Schritt.
Aber das Verstehen des Zusammenspiels des Schritts zur Erstellung der neuen Spalten mit der internen Funtion "fx_X" übersteigt aktuell meinen PQ_Kenntnisstand.
- ich wandle fast immer die in PQ überführte Excel-Tabelle in eine Funktion um und lösche dann die eigentliche Ausgangsabfrage, auch wenn sie nur als Verbindung angelegt wurde (kleine Marotte von mir) - wer sich meinen Code (Vba, Java, C#) näher ansieht, wird feststellen, daß da optionale Übergabeparameter immer angegeben werden, obwohl sie lt. Hilfe Standardeinstellungen sind; so halte ich es auch in PQ
Da im meiner PQ-Lösung die Spalte 'Splitpos' nicht in neue Spalten aufgeteilt, sondern in Listen umgewandelt werden, muß ich für die neuen Spalten: - 'Pos.1' Listenelement 0 und 1 - 'Pos.2' Listenelement 1 und 2 - 'Pos.3' Listenelement 2 und 3 usw. auslesen Das wird also durch die interne Funktion 'fx_X' realisiert (deshalb auch der Spaltename 'Pos.1' statt nur 'Pos1'). Diese Funktion liest also alle Zeichen nach dem Punkt im neuen Spaltennamen aus. Um genügend Listenelemente immer zu haben, wurde die Umwandlung ja mit 15 imaginären Elementen ergänzt (& List.Repeat({999},15)). Den Trick mit der internen Funktion habe ich in einer GoodLy-Lösung gesehen und sofort gebunkert. Bei a = Number.From(_[Splitpos]{fx_X(cur)-1}) entspricht ja 'cur' einem Listenelement vom Übergabeparameter 'DynamicColumnList', der alle neu anzulegenden Spaltennamen als Liste enthält und von List.Accumulate() einzeln abgeklappert wird (wie in einer For Each-Schleife in Vba). Bei cur = 'Pos.3' ergibt Number.From(_[Splitpos]{fx_X(cur)-1}) den Wert 2 und damit dem 3. Listenelement von '_[Splitpos]' der aktuellen Zeile (Record). Auf den Unterstrich vor '[Splitpos]' hätte man verzichten können, aber wie gesagt, Marotten sind schwer auszutreiben. Der Unterstrich wird besser erklärbar, wenn man each gegen (_)=> austauscht.
Mein Problem wäre eher woraus sich die Postionen ergeben sollen. Aber wenn es nur ums Beispiel Splitten geht mit selbst eingetragen Pos. dann auch so. Tab mit 2 Spalten.
Code:
Text Trennen aabbcc 2,4 aaabbbcccddd 3,6,9 aabbbbcccdddddde 2,6,9,15
Code:
let Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Trennen", type text}}), ListeA = Table.AddColumn(#"Geänderter Typ", "Benutzerdefiniert", each List.Reverse(Text.Split([Trennen],","))), ListAnz = Table.AddColumn(ListeA, "Benutzerdefiniert.1", each List.Count([Benutzerdefiniert])), Trennungrein = Table.AddColumn(ListAnz, "TrennText", each List.Accumulate([Benutzerdefiniert],[Text], (x, y) => Text.Insert(x,Number.FromText(y),"#"))), #"Spalte nach Trennzeichen teilen" = Table.SplitColumn(Trennungrein, "TrennText", Splitter.SplitTextByDelimiter("#", QuoteStyle.Csv), List.Max(Trennungrein[Benutzerdefiniert.1])+1), #"Entfernte Spalten" = Table.RemoveColumns(#"Spalte nach Trennzeichen teilen",{"Text", "Trennen", "Benutzerdefiniert", "Benutzerdefiniert.1"}) in #"Entfernte Spalten"
PQ-M kann so einfach sein, wenn man die richtige Idee hat, das Ziel zu erreichen. Auf dem 1. Blick war mir nicht klar, warum Du die Reihenfolge der Trennschritte in der Liste drehst, aber dann fiel es mir wie die Schuppen von den Augen und alles war klar wie Kloßbrühe. Im Beispiel von WS-53 mußte ich nur die '0' als Trennposition mittels M-Code entfernen entfernen und schon war alles paletti, Danke fürs zeigen und
Gruß von Luschi aus klein-Paris
PS: schade nur, das der Fragesteller überhaupt kein Interesse mehr für dieses Thema zeigt