Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Power Query

Forumthread: Power Query

Power Query
22.02.2025 11:18:16
hary
Moin zusammen
Bitte nicht an Excelkenntnisse stoeren.
Dank Yal bin ich auf den Geschmack mit Power Query gekommen. Also wirklich in den ersten Fussstapfen.
Zum Beispiel hab ich einen Alphanummerischen Text: 2ww13er3kkk333
mit VBA / Regex kein Problem, aber mit Power Query ;-))
Mit Text.select bekomm ich zwar die einzelnen Zahlen raus 2133333
Moechte aber 2 13 3 333 als Liste.
Schon mal Danke fuer Tips und fuers lesen.
gruss hary

Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Power Query
22.02.2025 11:38:03
Eifeljoi 5
Hallo

Meine Lösung hier lautet:
let in

Table.AddColumn(Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], "Spalte2", each Text.Select([Spalte1], {"0".."9"}))
AW: Danke euch beiden, kann damit weiterarbeiten. gruss qwT.
22.02.2025 14:20:43
hary
.
AW: Power Query
24.02.2025 13:16:44
Yal
Moin,

spät dran, es war ja Wochenende.

= Table.AddColumn(#"Geänderter Typ", "Trenner", each List.Select(Splitter.SplitTextByAnyDelimiter({"A".."Z","a".."z"},QuoteStyle.Csv)([Spalte1]), each _ > ""))

macht aus dem Inhalt von "Spalte1" eine List aus einzelnen Zahlen.

Anschliessend auf Zeilen expandieren und pivotieren.
Alternativ wäre in einem Text mit Semikolon zu kombinieren und in Spalten zu splitten.

VG
Yal

Anzeige
AW: Power Query
22.02.2025 11:56:23
hary
Moin Eifeljoi 5
Durch
each Text.Select([Spalte1], {"0".."9"}))

kommt aber auch 2133333 als ganze Zahl raus und nicht getrennt.
Es sollte aber
2
13
3
333
rauskommen.
Also wie bei Regex mit \d+
Danke schon mal
gruss hary
Anzeige
AW: Frage offen vergessen, sry
22.02.2025 12:20:07
hary
.
Im Anhang habe...
22.02.2025 13:51:10
Case
Moin, :-)

... ich dir mal zwei Möglichkeiten erstellt: ;-)
https://www.herber.de/bbs/user/175928.xlsx

Schritte wie - in Zahl umwandeln - bekommst du hin, wenn du es brauchst. ;-)

Servus
Case
Anzeige
AW: hierzu festgestellt sowie nachgefragt ...
22.02.2025 20:37:24
neopa C
Hallo Case,

... in Deinen beiden aufgezeigten Lösungsvarianten, muss sollten aber die Werte zwingend mit einer Ziffer beginnen, anderenfalls bleibt sonst der 1. Ergebniswert leer.
In Deiner ersten Variante wird die Anzahl der Ziffernfolgen nicht dynamisch ausgewertet.

Wie würdest Du eine Lösungsvariante definieren, wenn anstelle nur reiner Ziffernfolgen (wie hier im Beispiel) auch Datumswerte (diese im einfachsten Fall bestehend aus TT.MM.JJ-Angaben) und/oder Dezimalzahlen aus einem alphanumerischen Textwert zu separieren wären?

Solltest Du schon heute Deine Lösungsvorschläge einstellen, dann werde ich erst morgen darauf reagieren können.
Wünsche noch einen schönen Abend.

Gruß Werner
.. , - ...
aus C the unseen

Anzeige
Dazu schnell ein paar...
23.02.2025 02:56:32
Case
Moin Werner, :-)

... Gedanken:

Der Tehmenersteller hat nur ein Beispiel genannt. Darauf habe ich geantwortet. Einmal mit einer starren Lösung (4 Zahlen) und einmal mit einer dynamischen Lösung. ;-)

Damit ist das Thema für mich eigentlich durch. ;-)

Nehme ich am Anfang eine Zahl weg - macht er genau was ich will! Er lässt die erste Spalte frei. Möchte der Themenersteller etwas anderes - fragt er nach. ;-)

Userbild

Kommt noch eine Zahl dazu, versagt die statische Variante logischerweise. Ich habe aber auch nichts anderes gesagt. ;-)

Userbild

Die dynamische funktioniert wieder wie ich es will bzw. vorgegeben habe. ;-)

Userbild

Die "null" ist einfach zu entfernen, wenn sie stört. Wird ja nachher nicht angezeigt. Kann aber Probleme machen. ;-)

Zum Datum:
Wenn du nur Daten in der Form TT.MM.JJ im Text drin hast ist es einfach (Text.Select(...) mit Zahlen und Punkt.
Sind noch andere Texte mit Punkt drin, dann eben (Text.Start(Text.Select(...) auswählen und einkürzen, damit die Punkte am Ende verschwinden.

Userbild

Jetzt kommt aber die Krux, dass es Daten in verschiedensten Formaten gibt:
Es sind noch andere Zahlen mit drin.
Der Tag ist nur einstellig.
Der Monat ist nur einstellig.
Das Jahr ist nur zweistellig.
Es ist kein Leerzeichen zwischen TextDatumText.
Und die Abwandlungen bzw. Umkehrungen dazu.

Wenn es nur 2000er Jahre sind geht es noch. Kommt noch 19hundert dazu wird es schon aufwändiger.

Habe mich mal viel mit Datum befassen müssen und in dem Zuge eine Abfrage gebastelt. Kann ich raussuchen, wenn du willst. Kann aber etwas dauern.

Leider gibt es noch kein Text.RegexReplace oder Character.IsDigit in PQ. Ist aber schon gewünscht. Mal sehen, wann und in welchem Umfang es kommt. Dann ist es ein Klacks.

Servus
Case
Anzeige
AW: hierzu ...
23.02.2025 17:29:11
neopa C
Hallo Case,

... vielen Dank für Deine recht ausführliche Antwort. :-)

Folgendes hierzu angemerkt: Ich hatte meine gestrigen Feststellungen und Nachfragen nicht korrekt formuliert. Sie sollten auf jeden Fall keine Kritik sein, sondern waren mehr nur meine Gedanken, die sich mir auftaten. Ich betrachte mich zwar nicht mehr als PQ-Einsteiger, aber bin bisher nur wenig über diese Phase hinausgekommen (nutze PQ fast ausschließlich nur interaktiv). Deine vorherigen Antworten hatten ja auch harry offensichtlich zufriedengestellt. Aber mir hatten sich daraus ergänzende Fragen ergeben. Ich wußte und weiß nicht, wie ich diese mir beantworten hätte können. Also wie man dies mit PQ sinnvollerweise löst. Obwohl ich dies nicht wirklich selbst brauche, erschließe ich mir ab und zu gern neues. Bitte sieh also meine hier getroffenen Feststellungen und Nachfragen in diesem Zusammenhang.

Folgendes würde ich nun doch gern noch wissen:
Wie kann man bezogen auf Deine mir aufgezeigten bildlichen Ergebnisdarstellungen in/mit PQ so vornehmen, das der erste Zahlenwert aus/in einem alphanumerischen Text in der Ergebnisliste dann auch der ersten Ergebnisspalte zugeordnet wird und die Ergebnisauswertung bzgl. der Anzahl der (Zahlen-)Datenwerte dynamisch bleibt. Geht das (vertretbar) interaktiv zu realisieren oder bedarf es dazu doch eher der direkten Programmierungsergänzung mit M-Code?

Gruß Werner
.. , - ...
aus C the unseen
Anzeige
Das ist mit...
23.02.2025 19:51:43
Case
Moin Werner, :-)

... vertretbarem Aufwand zu machen - ob es Sinn ergibt lassen wir mal dahingestellt. ;-)
https://www.herber.de/bbs/user/175940.xlsx

tblErg4:
Im Prinzip muss noch ein Schritt eingeschoben werden. Liste Rekords erstellen. Schauen ob der erste leer ist. Mit List.Skip arbeiten "null" hinten anhängen. Datensatz rekonstruieren. In Tabelle umwandeln. Dann leere löschen. In tblErg3 wird noch nichts verschoben. ;-)

Ich habe einiges von hier gelernt: ;-)
https://gorilla.bi/sitemap/

Servus
Case
Anzeige
AW: danke schon mal ...
24.02.2025 21:14:57
neopa C
Hallo Case,

... wirklich anschauen kann ich es mir jedoch wohl frühestens morgen Abend. Dann schau mir auch Luschis und Yal Beitrag an.
Schönen Abend dann noch.

Gruß Werner
.. , - ...
aus C the unseen
AW: vieles ist machbar, doch ...
25.02.2025 21:00:07
neopa C
Hallo Case,

... es braucht aber auch viel Grundlagenwissen und Zeit, um herauszufinden wie es geht. Mir mangelt es da leider an beiden.
Vielen Dank für den Link

Gruß Werner
.. , - ...
aus C the unseen
Anzeige
AW: Frage offen vergessen, sry
22.02.2025 13:58:44
Eifeljoi 5
Hallo
Was soll man sagen, wenn man nicht im Stande ist gleich eine Datei mit Wunschergebnis zur Verfügung stehlt..
let in

Table.FromColumns({Table.Column(Table.TransformColumns(Table.SplitColumn(Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
"Spalte1", Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)),{"Spalte1.1","Spalte1.2",
"Spalte1.3", "Spalte1.4"}), {{"Spalte1.1", each Text.Select(_, {"0".."9"})}, {"Spalte1.2", each Text.Select(_, {"0".."9"})},
{"Spalte1.3", each Text.Select(_, {"0".."9"})}, {"Spalte1.4", each Text.Select(_, {"0".."9"})}}), "Spalte1.1") & Table.Column(
Table.TransformColumns(Table.SplitColumn(Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], "Spalte1",
Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)), {"Spalte1.1", "Spalte1.2",
"Spalte1.3", "Spalte1.4"}), {{"Spalte1.1", each Text.Select(_, {"0".."9"})}, {"Spalte1.2", each Text.Select(_, {"0".."9"})},
{"Spalte1.3", each Text.Select(_, {"0".."9"})}, {"Spalte1.4", each Text.Select(_, {"0".."9"})}}), "Spalte1.2") & Table.Column(
Table.TransformColumns(Table.SplitColumn(Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], "Spalte1",
Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)), {"Spalte1.1", "Spalte1.2",
"Spalte1.3", "Spalte1.4"}), {{"Spalte1.1", each Text.Select(_, {"0".."9"})}, {"Spalte1.2", each Text.Select(_, {"0".."9"})},
{"Spalte1.3", each Text.Select(_, {"0".."9"})}, {"Spalte1.4", each Text.Select(_, {"0".."9"})}}), "Spalte1.3") & Table.Column(
Table.TransformColumns(Table.SplitColumn(Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], "Spalte1",
Splitter.SplitTextByCharacterTransition({"0".."9"}, (c) => not List.Contains({"0".."9"}, c)), {"Spalte1.1", "Spalte1.2",
"Spalte1.3", "Spalte1.4"}), {{"Spalte1.1", each Text.Select(_, {"0".."9"})}, {"Spalte1.2", each Text.Select(_, {"0".."9"})},
{"Spalte1.3", each Text.Select(_, {"0".."9"})}, {"Spalte1.4", each Text.Select(_, {"0".."9"})}}), "Spalte1.4")}, {"Ergebnis"})

Es geht noch besser und kürzer.
Anzeige
AW: @Eifeljoi 5
22.02.2025 14:11:33
hary
Moin
"wenn man nicht im Stande ist..."
Klar bin dazu im Stande. Bin ja schon lange dabei und meine Fragen kannst du an 5 Fingern abzaehlen.
Mir geht es nur um Anstoesse.
gruss hary
AW: @Eifeljoi 5
24.02.2025 10:07:20
Luschi
Hallo hary,

ärgere Dich nicht, denn mit dem Code von Eifeljoi 5 kann man in der Praxis sowieso kaum was anfangen:
- total statisch und auf 4 Split-Positionen begrenzt
- kommen weitere Positionen hinzu, ist der Code so unflexibel, daß es kaum einen Einstiegspunkt für die Anpassung gibt
- treten Error-Meldungen auf, muß man umfangreiche Anpassungen vornehmen, um die Fehlerstelle zu finden
- aber was soll's: auf meine Kritkpunkte in anderen PQ-M Beiträgen von ihm reagiert er ja nicht

Hier mal meine Anpassung vom PQ-M-Code von Case (Fall 2):
//by Luschi

let
Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
//15 Split-Positionen festlegen
#"Anzahl Split" = 15,
//Spalte 'Werte splitten - es entstehen 15 Spalten, die mit 'null' aufgefüllt werden
Spaltentrennung= Table.SplitColumn(Quelle, "Werte",
Splitter.SplitTextByCharacterTransition(
(c) => not List.Contains({"0".."9"}, c), {"0".."9"}),
List.Transform(List.Numbers(1, #"Anzahl Split"), each "Werte." & Text.From(_))),
//alle leeren Spalten umbenennen
#"Spalten umbenennen" = Table.TransformColumnNames(Spaltentrennung,
each if List.IsEmpty(List.RemoveNulls(Table.Column(Spaltentrennung, _)))
then Text.Replace(_,"Werte","xxx")
else _),
//alle leeren Spalten als Löschspalten in 1 Liste festlegen
LoeschSpalten =
let a = Table.ColumnNames(#"Spalten umbenennen"),
b = List.Transform({1..List.Count(a)}, each "xxx." & Text.From(_)),
c = List.Intersect({a, b})
in c,
//festgelegte Löschspalten entfernen
#"Spalten Loeschen" = Table.RemoveColumns(#"Spalten umbenennen", LoeschSpalten),
//nur Zahlen bleiben erhalten
#"Spalten Bereinigt" = Table.TransformColumns(#"Spalten Loeschen",
List.Transform(Table.ColumnNames(#"Spalten Loeschen"),
(spalte) => {spalte, each Text.Select(_, {"0".."9"}), type text}))
in
#"Spalten Bereinigt"

Gruß von Luschi
aus klein-Paris


Anzeige
AW: @Luschi
24.02.2025 10:40:34
hary
Moin Luschi
"ärgere Dich nicht"
Ich doch nicht. Mir geht es wie Werner. Brauche es nicht, aber neues lernen schadet nicht. Vor allem ich moechte es verstehen.
Bsp.
#"Spalten Bereinigt"

Das # ist ja nur eine Kleinigkeit aber als Anfaenger, wenn man einen Code sieht, fragt man(ich) sich wofuer steht das Zeichen steht.
Ich weiss es ;-))
Wie immer gesagt wird: "Hast du den Code auch verstanden"
Ergo ist es Fleissarbeit. Darum geht es mir.
Danke fuer den Code.
Gruss hary
Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18