Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Power Query: Splitter.Splitbypositions mit variablen Positionen
#1
Hallo Ihr Wissenden,

folgende Frage habe ich - und hoffe, dass Ihr dazu vielleicht eine Idee habt:
  • in meiner Tabelle habe ich eine Spalte mit Texten, die ich splitten will: "Z2"
  • dazu habe ich in einer weiteren Spalte Listen gebildet mit den Positionen, an denen die Textspalte getrennt werden soll: "TrennList"
  • nun möchte ich im nachfolgenden Step die Textspalte trennen, jede Zeile gemäß den Positionen, die jeweils in der Spalte 'TrennList' stehen
Mein 'einfacher' Ansatz war:
Code:
= Table.SplitColumn(TrennListe, "Z2", Splitter.SplitTextByPositions([TrennList]), {"Com_vorChCd", "Com_nachChCd"})
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:
.png   2023-10-20_09h08_12.png (Größe: 445 Bytes / Downloads: 155) - ü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. 27
Antworten Top
#2
Hi

Problem nicht ganz erfasst. Warum kann nicht einfach an dem Zeichen getrennt werden? Bitte Paar Beispiele wie es am Ende getrennt auszusehen hat.

Gruß Elex
Antworten Top
#3
Hallo RaiSta,

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.

Gruß von Luschi
aus klein-Paris
Antworten Top
#4
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.


Angehängte Dateien
.xlsx   cef - Power Query - Splitter.Splitbypositions mit variablen Positionen (PQ).xlsx (Größe: 32,83 KB / Downloads: 4)
Antworten Top
#5
Hallo WS-53,

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 

Gruß von Luschi
aus klein-Paris


Angehängte Dateien
.xlsx   cef - Power Query - Splitter.Splitbypositions mit variablen Positionen_01b.xlsx (Größe: 37,65 KB / Downloads: 5)
Antworten Top
#6
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.
Antworten Top
#7
Hallo WS-53,

- 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.

Gruß von Luschi
aus klein-Paris
Antworten Top
#8
Moin

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"
Gruß Elex
Antworten Top
#9
Hallo Elex,

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
Antworten Top
#10
Zitat:schade nur, das der Fragesteller überhaupt kein Interesse mehr für dieses Thema zeigt

Da ich ja Hilfe hauptsächlich benutze, um selbst zu lernen, ist es halbwegs verschmerzbar.
Antworten Top


Gehe zu:


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