Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1840to1844
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

PowerQuery Split nach Anzahl Zeichen

PowerQuery Split nach Anzahl Zeichen
25.07.2021 13:27:50
Benjamin
Hallo liebes Forum,
gibt es eine Möglichkeit folgende Funktion (Power Query) um die Funktion "Trennen nur nach Leerzeichen" zu erweitern?
Ziel ist es Texte nach max. 40 Zeichen zu trennen aber nicht die Wörter zu zerreißen.
= Table.ExpandListColumn(Table.TransformColumns(#"Neu angeordnete Spalten", {{"Element:Text.1", Splitter.SplitTextByRepeatedLengths(40) , let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}) , "Element:Text.1")
Grüße Ben

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ist sicherlich möglich ...
25.07.2021 16:56:01
neopa
Hallo Benjamin,
... doch ich würde dazu eine Hilfsspalte mit einer Formel nutzen.So:
 ABCDE
1LangTextletztes TextTeil1RestText
2das ist ein Texttest mit mehr als 40 Zeichen der zuvor getrennt werden soll37 das ist ein Texttest mit mehr als 40Zeichen der dann getrennt werden soll
3Ziel ist es Texte nach max. 40 Zeichen zu trennen aber keine Wörter zerreißen.39 Ziel ist es Texte nach max. 40 Zeichenzu trennen aber keine Wörter zerreißen.
4Benjamin vom 25.07.2021 in HerbersForum, PowerQuery Split nach Anzahl Zeichen27 Benjamin vom 25.07.2021 inHerbersForum, PowerQuery Split nach Anzahl Zeichen
5     

ZelleFormel
B2=AGGREGAT(14;6;ZEILE(A$1:A$40)/(TEIL([@LangText];ZEILE(A$1:A$40);1)=" ");1)
Verwendete Systemkomponenten: [Windows (32-bit) NT 6.02] MS Excel 2010
Diese Tabelle wurde mit Tab2Html (v2.6.0) erstellt. ©Gerd alias Bamberg

Und dann in PQ:
let
Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"letztes", Int64.Type}}),
#"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Geänderter Typ", "TextTeil1", each Text.Middle([LangText],0, [letztes])),
#"Hinzugefügte benutzerdefinierte Spalte1" = Table.AddColumn(#"Hinzugefügte benutzerdefinierte Spalte", "RestText", each Text.Middle([LangText],[letztes],99)),
#"Entfernte Spalten" = Table.RemoveColumns(#"Hinzugefügte benutzerdefinierte Spalte1",{"LangText", "letztes"})
in
#"Entfernte Spalten"
Gruß Werner
.. , - ...
Anzeige
AW: PowerQuery Split nach Anzahl Zeichen
25.07.2021 17:05:14
Günther
Moin,
ja die gibt es. Bei deinem obigen Satz

gibt es eine Möglichkeit folgende Funktion (Power Query) um die Funktion "Trennen nur nach Leerzeichen" zu erweitern?

wäre das die Zeichenfolge "gibt es eine Möglichkeit folgende" (natürlich mit PQ erstellt).
Und das war's von meiner Seite. Ich hasse es, wenn sich ein Fragesteller ein Minimum an Mühe gibt und (wie hier) ein zusammenhangloses M-Statement dahin klatscht. Das ist zwar besser als gar nichts, aber eine Muster-xlsx (gerne mit deinem kompletten Versuch) und mit einem händischen Wunsch-Ergebnis macht natürlich Arbeit, die "man" vielleicht gerne auf gelangweilte (?) Foren-Helfer abwälzt. Aus dem Grunde bin ich raus.
Günther  |  mein Excel-Blog
Anzeige
AW: PowerQuery Split nach Anzahl Zeichen
26.07.2021 13:30:38
ChrisL
Hi
Vielleicht habe ich zu kompliziert gedacht oder ich habe eine Standard-Option übersehen. Somit kein Anspruch für eine perfekte/optimale Lösung. Im Anhang ein Beispiel:
https://www.herber.de/bbs/user/147312.xlsx
- Split bei fixer Zeichenzahl
- Erste Spalte Split nach Leerzeichen von Rechts (= zerteiltes Wort das übrig bleibt)
- Neuer Split nach Zeichenzahl minus Länge vom zerteilten Wort
(angereichert mit einem Wenn-Dann, falls der Split genau auf das Leerzeichen fällt)
Auszug:

=Text.Start([#"Tabelle1 (2).Text"],40-(if [Text.1.2] = null or Text.Start([Text.2],1)  = " " then 0 else Text.Length([Text.1.2]))) 
cu
Chris
Anzeige
AW: da wurde mir regelrecht "schwindelig" ...
26.07.2021 16:17:31
neopa
Hallo Chris,
... als ich Deine funktionierende Lösung nachvollziehen wollte, vor lauter links, rechts .... Ich habe dann auch aufgeben, als ich versucht habe darüber nachzudenken, wie denn die Lösung aussehen könnte, wenn der Text nicht nur max. 2 Trennlänge lang ist sondern x-mal und immer je Teillänge die max. Vorgabelänge eingehalten werden soll.
Um solches hatte ich mich schon beim Einstellen meines Formel-/PQ-Lösungsvorschlages bewusst gedrückt. Da sollte es in PQ eine einfachere Lösung geben. Ansonsten würde ich immer eine reine Excellösung bevorzugen und seien es noch so viele Datentexte die zu trennen wären. Schließlich macht dann diese Trennung ja wahrscheinlich nur einmal.
Gruß Werner
.. , - ...
Anzeige
AW: da wurde mir regelrecht "schwindelig" ...
26.07.2021 16:58:29
Luschi
Hallo Werner,
hier mal mein PQ-Versuch, der durch die fx-Funktionen natürlich auch ausbaufähig ist.
https://www.herber.de/bbs/user/147317.xlsx
Gruß von Luschi
aus klein-Paris
AW: da wurde mir regelrecht "schwindelig" ...
27.07.2021 18:02:25
Luschi
Hallo PQ--Fan's,
hier eine neue Version, wie man die Split-Positionen in PQ ermitteln kann, wenn man die Möglichkeiten des List-Objekts nutzt.
Dabei wurden nur 2 fx-Funktionen erstellt, die mit entsprechender Parameterübergabe in PQ alles erledigen und an Excel zurückgeben.
https://www.herber.de/bbs/user/147337.xlsx
Gruß von Luschi
aus klein-Paris
Anzeige
tolle Lösung owT.
28.07.2021 15:43:53
ChrisL
.
AW: da wurde mir regelrecht "schwindelig" ...
31.07.2021 17:51:36
Benjamin
Hallo Luschi,
echt eine tolle Lösung, soweit ich das beurteilen kann.
Könntest du die XLS evtl. für mich, um eine Ausgabespalte mit Parameterübergabe und der gewünschten Splittfunktion (bis_40) erweitern?
Mir ist leider nicht ganz klar wie das funktioniert.
Vielen, vielen Dank für deine Lösung bis jetzt.
Grüße Benjamin
AW: der thread ist mittlerweile archiviert ...
01.08.2021 18:57:53
neopa
Hallo Benjamin,
... und somit in der aktuellen Forumsliste nicht mehr sichtbar. Wer wie ich und sehr wahrscheinlich Luschi und auch Chris keine E-Mail-Benachrichtung im Forum eingerichtet hat, kann auf diesen nur dann antworten, wenn er diesen Deinen letzten Beitrag in der Beitragsliste zufällig findet, wie eben ich.
Chris (sollte er Deinen oder meinen Beitrag lesen) und auch ich könnten Dir schon auch helfen, aber unsere Beiträge Dir zu helfen, hast Du ja nicht wahrgenommen.
Gruß Werner
.. , - ...
Anzeige
AW: der thread ist mittlerweile archiviert ...
01.08.2021 21:43:16
Benjamin
Hallo Werner und alle anderen Threadteilnehmern.
Schon mal recht herzlichen Dank für eure Bemühungen. Mit so vielen Lösungen hab ich nicht gerechnet.
Bitte entschuldigt meine Abwesenheit.
Ich würde gerne luschis Weg verwenden, habe aber große Probleme (Mangels M-Code Kenntnissen) diese nun zu implementieren.
Vielleicht wäre noch jemand so lieb, und würde luschis Datei:
https://www.herber.de/bbs/user/147337.xlsx
noch eine Ausgabespalte hinzufügen, in der dann der getrennte Text mit max.40 Zeichen ausgegeben wird.
Der restliche Text dann am besten in der Zeile darunter. Es sollte alles in PQ sein, da die Funktion dann später in einer Vielzahl von XLS Abrufen funktionieren sollte.
Wenn mir jemand helfen könnte, wäre das echt MEGA ,da ich schon etliche Stunden versuche eine Lösung dafür zu finden.
Grüße Benjamin
Anzeige
AW: der thread ist mittlerweile archiviert ...
01.08.2021 22:28:03
Oberschlumpf
hi Benjamin,
es steht doch sogar schon im Betreff:
der thread ist mittlerweile archiviert
Wenn du weiterhin Hilfe benötigst, erstell doch einfach einen neuen Beitrag mit Verweis auf deinen Archiv-Link zum alten Beitrag.
Ciao
Thorsten
AW: die Ergebnisausgabe ist zeilenorientiert ...
02.08.2021 09:13:59
neopa
Hallo Benjamin,
... d.h. der Langtext wird mit PQ im Normalfall in einer Ergebnistabelle getrennt in Spalten nebeneinander ausgeben. Eine Ausgabentrennung in der gleichen Spalte ist sicherlich auch möglich, würde aber noch mehr Aufwand verursachen und kann ich Dir nicht anbieten.
Für die von Dir angestrebte Trennung hast Du noch nicht angegeben, wie die Texte nach den ersten Trennung dargestellt werden sollen, wenn die entsprechenden Langtexte evtl. länger als 80 Zeichen sein sollten. Soll unabhängig von der Gesamtlänge der gesamte Rest in eine zweite Zelle geschrieben werden oder eine weitere Trennung vorgenommen werden? Wenn ja, wie viele Trennungen sollen/müssen denn max. vorgenommen werden?
Gruß Werner
.. , - ...
Anzeige
AW: da wurde mir regelrecht "schwindelig" ...
26.07.2021 18:00:44
ChrisL
Hi Werner
Ja sorry, die Lösung habe ich nicht schön dargestellt (u.a. Spalten nicht treffend bezeichnet). Luschi hat es deutlich eleganter/übersichtlicher gemacht.
Daran, dass möglicherweise mehrere Trennungen vorgenommen werden müssen, habe ich gar nicht gedacht. Guter Punkt ;)
cu
Chris
AW: (m)ein neuer Lösungsansatz mit PQ ...
26.07.2021 17:18:15
neopa
Hallo Chris, hallo Luschi,
... kommt unter der Voraussetzung das die Aufteilung nur in zwei Textteile vorgenommen werden soll, mit max Teillänge 5 für das Beispiel von Chris mit nur einer Abfrage aus.
let
Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content],
#"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Text", type text}}),
#"Spalte nach Position teilen" = Table.SplitColumn(#"Geänderter Typ", "Text", Splitter.SplitTextByPositions({0, 5}, false), {"Text.1", "Text.2"}),
#"Duplizierte Spalte" = Table.DuplicateColumn(#"Spalte nach Position teilen", "Text.2", "Text.21"),
#"Spalte nach Position teilen1" = Table.SplitColumn(#"Duplizierte Spalte", "Text.2", Splitter.SplitTextByPositions({0, 1}, false), {"Text.2.1", "Text.2.2"}),
#"Geänderter Typ1" = Table.TransformColumnTypes(#"Spalte nach Position teilen1",{{"Text.1", type text}, {"Text.2.1", type text}, {"Text.2.2", type text}, {"Text.21", type text}}),
#"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Geänderter Typ1", "Benutzerdefiniert", each if [Text.2.1]=" " then [Text.1]&" " else [Text.1]),
#"Spalte nach Trennzeichen teilen" = Table.SplitColumn(#"Hinzugefügte benutzerdefinierte Spalte", "Benutzerdefiniert", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, true), {"Benutzerdefiniert.1", "Benutzerdefiniert.2"}),
#"Geänderter Typ2" = Table.TransformColumnTypes(#"Spalte nach Trennzeichen teilen",{{"Benutzerdefiniert.1", type text}, {"Benutzerdefiniert.2", type text}}),
#"Neu angeordnete Spalten" = Table.ReorderColumns(#"Geänderter Typ2",{"Text.1", "Text.2.1", "Text.2.2", "Benutzerdefiniert.1", "Benutzerdefiniert.2", "Text.21"}),
#"Entfernte Spalten" = Table.RemoveColumns(#"Neu angeordnete Spalten",{"Text.1", "Text.2.1", "Text.2.2"}),
#"Zusammengeführte Spalte eingefügt" = Table.AddColumn(#"Entfernte Spalten", "Zusammengeführt", each Text.Combine({[Benutzerdefiniert.2], [Text.21]}, ""), type text),
#"Entfernte Spalten1" = Table.RemoveColumns(#"Zusammengeführte Spalte eingefügt",{"Benutzerdefiniert.2", "Text.21"}),
#"Umbenannte Spalten" = Table.RenameColumns(#"Entfernte Spalten1",{{"Benutzerdefiniert.1", "Text links"}, {"Zusammengeführt", "Text rechts"}})
in
#"Umbenannte Spalten"
Bin jetzt erst einmal ein paar Tage nicht online. Schaue mir die Lösung von Luschi später an.
Gruß Werner
.. , - ...
Anzeige
AW: wenn mehr als 2 Teiltexte entstehen sollen ...
26.07.2021 17:29:17
neopa
Hallo,
... also drei oder 4 mit der gleichen max Textteillänge, könnte man für den ermittelten rechten Textteil die Schritte wiederholen.
Aber vielleicht geht es ja auch einfacher aber zumindest kürzer, wenn man die M-Sprache beherrscht.
Gruß Werner
.. , - ...
AW: führende Leerzeichen im Text rechts ...
26.07.2021 17:54:46
neopa
Hallo
... sollten natürlich noch geglättet werden:
= Table.AddColumn(#"Umbenannte Spalten", "Text rechts geglättet ", each Text.Trim([Text rechts]))
Gruß Werner
.. , - ...
Wenn ich den Aufwand mit Standard-Xl ...
29.07.2021 02:01:40
Luc:-?
…bzw PQs Sprache M sehe, Ben @ all,
ist der mit VBA auch nicht größer und hat den Vorteil, dass die benötigten UDFs bereits existieren und in Fmln angewendet wdn können. Ich benutze das öfter und hatte das auch schon hier gezeigt., aber es ist ja eher uncool, auf Vorhandenes im Archiv zu verweisen… :-]
Eine solche Fml würde dann so aussehen: =TxRows(A1;40)
Mit ZeilenUmbruch erhält man dann für das Bsp Ziel ist es, Texte nach maximal 40 Zeichen zu trennen, aber nicht die Wörter zu zerreißen. einen 3zeiligen Text in einer Zelle. Soll der auf mehrere Zellen (BlattZeilen) aufgeteilt wdn, lautete die plurale MatrixFml so:
{=MTRANS(VSplit(TxRows(A1;40);ZEICHEN(10)))}
Das ergäbe eine Auslastung der 3 Zellen mit den TextLängen 34, 34, 20.
Die UDF TxRows erlaubt aber auch eine bessere Auslastung des ZeilenlängeGrenzwerts, indem in den QuellText ggf zusätzliche relative TrennZeichen eingefügt wdn können, hier zB so per _: =TxRows(WECHSELN(A1;"eic";"ei_c");40;"_")
Die Aufteilung auf mehrere Zellen erfolgt dann analog: {=MTRANS(VSplit(TxRows(WECHSELN(A1;"eic";"ei_c");40;"_");ZEICHEN(10)))}
Das ergäbe hier dann eine ZellenAuslastung von 39, 38, 13 Zeichen.
ArchivLinks:
• TxRows (Vs1.2) https://www.herber.de/cgi-bin/callthread.pl?index=1084680#1085532
• VSplit (Vs1.1) https://www.herber.de/bbs/user/99024.xlsm (DownLoad BspDatei m.UDFs)
Wo die UDF-Pgmm hingehören, erkennt man am DownLoad-Bsp.

Morhn, Luc :-?
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon

305 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige