PQ: Zahl aus Text extrahieren / separieren

Xtract: Per Pow­er Query Zahlen (Zif­fer­n­fol­gen) aus einem Text in jed­er Zelle der Spalte extrahieren, auch vor Excel 2019365.

  Wis­sens­stand: Lev­el 3 ⇒  Excel GUT!, min­destens Basis-Ken­nt­nisse in Pow­er Query

Foren-FAQ: Zahlen aus Strings extrahieren und summieren

Dieser Beitrag in einem Forum hat mich ein­fach ein­mal gereizt. Es sind ver­schiedene Antworten gegeben wor­den, aus­nahm­sweise ist mein Beitrag zum The­ma nur an dieser Stelle, also hier im Blog. Der Grund dafür liegt in ein­er „Macke” von mir begrün­det und soll hier nicht disku­tiert wer­den.

Mir war klar, dass solch eine Auf­gabe auf ver­schiedene Weisen gelöst wer­den kann. Mit VBA hat­te ich den Ablauf klar vor Augen, wenn meine Idee auch eher in einen anderen Ver­gle­ich (als im Beitrag im Forum) zugrunde gelegt hätte. Ich wollte es aber mit Pow­er Query lösen und ver­suchte dieses oder jenes, was auf eini­gen Umwe­gen dann auch zum Ziel führte. Und bei mein­er Recherche „stolperte” ich dann über diesen Beitrag von Ken Puls und ich erkan­nte wieder ein­mal, dass Ken ein wahrer Meis­ter in Sachen PQ ist. Die dort ver­Link­te Lösung habe ich leicht angepasst für meine Lösung ver­wen­det. Die haupt­säch­lichen Änderun­gen sind die unter­schiedlichen Namen der Spal­ten und bei den auszu­tauschen­den Zeichen habe ich statt des Dez­i­malpunk­tes das Dez­i­malkom­ma aus der Liste aus­ge­lassen und großzügig die ganzen europäis­chen Son­derze­ichen als zu löschende Zeichen mit aufgenom­men.

Die ange­botene Muster-xlsx aus dem Forum habe ich so ver­schlankt, dass die fehler­haften Ergeb­nisse  sowie die Spal­ten ab AP ent­fer­nt sind; laden Sie das File hier herunter, um die hier disku­tierten einzel­nen Schritte nachvol­lziehen zu kön­nen.

Sie begin­nen natür­lich damit, die Muster-Datei in Pow­er Query zu importieren. Wie Sie das erledi­gen, ist prinzip­iell egal, Haupt­sache die Dat­en aus dem Bere­ich B3:AO13 befind­en sich kom­plett im Pow­er Query-Edi­tor:

Die Daten direkt nach dem Import

Die Dat­en direkt nach dem Import (nicht alle sind im Screen­shot sicht­bar)

▲ nach oben …

Liste der zu löschenden Zeichen erstellen

Im näch­sten Schritt geht es darum, eine Liste jen­er Zeichen zu erstellen, die gelöscht wer­den sollen, damit nur die Zahlen übrig bleiben. Das sind in diesem Fall prinzip­iell alle alphanu­merischen Zeichen, ausgenom­men die Zif­fern, das Kom­ma (als Dez­i­mal­tren­ner) und natür­lich das Minus-Zeichen. Leerze­ichen belasse ich, falls ein­mal mehrere Zahlen in einem String enthal­ten sind und diese dann noch getren­nt wer­den kön­nen.

Der ein­fach­ste Weg wäre gewiss, eine Tabelle in einem Arbeits­blatt anzule­gen und diese beispiel­sweise über die ZEICHEN() – Funk­tion auszufüllen. „Ein­fach” ja, aber gewiss nicht ele­gant. 🙄 Da hat Ken Puls mir den wesentlich besseren Weg gewiesen. – Begin­nen Sie damit, im Reg­is­ter Start | Neue Quelle | Andere Quellen | Leere Abfrage auszuwählen. In die Eingabezeile geben Sie nun fol­gende Formel mit dem führen­den Gle­ich­heit­sze­ichen (mit oder ohne Zeilenum­bruch) ein:
= List.Transform({33..43,46,47,58..126,127..221}, each Character.FromNumber(_))
und bestäti­gen mit der Eingabe-Taste. Benen­nen Sie die erstellte Liste mit dem automa­tisch erstell­ten Namen (wahrschein­lich Abfrage1) um, damit sie den deut­lich sin­nvolleren Namen ZuLoeschen­deZe­ichen (ide­al­er­weise ohne Leerze­ichen) bekommt. Das stellt sich nun so dar:

Die hier aufgeführten Zeichen werden gelöscht

Die hier aufge­führten Zeichen wer­den im weit­eren Ver­lauf gelöscht

Eine kleine Erk­lärung bin ich Ihnen vielle­icht schuldig: Die Zahlen in der Formel ste­hen für exakt den Wert, welchen Sie in einem Arbeits­blatt als ZEICHEN() – Funk­tion ver­wen­det hät­ten; es sind die ASCII-Num­mern der Zeichen. Im Inter­net kön­nen Sie in diversen Tabellen die Zuord­nung der numerischen Werte zu den Zeichen nach­schla­gen.

Ide­al­er­weise spe­ich­ern Sie nun diese Liste nicht als Tabelle son­dern nur als Typ Nur Verbindung erstellen. Dazu entwed­er im Reg­is­ter Start ein Klick auf den Text Schließen &  laden und dann Schließen & laden in… oder Sie gehen über das Reg­is­ter Datei und wählen dort den entsprechen­den Menüpunkt direkt aus.

▲ nach oben …

Die Konvertierung

Jet­zt kön­nten Sie direkt dabei gehen und die Werte der einzel­nen Spal­ten so kon­vertieren, dass nur noch die Zahlen übrig bleiben. Der Weg wäre aber gewiss zu umständlich und aus mein­er Sicht auch fehler­an­fäl­liger als der nun aufgezeigte Vorge­hens-Vorschlag:

  • Wech­seln Sie zum Reg­is­ter Spalte hinzufü­gen.
  • Wählen Sie im Menüband den Punkt Indexs­palte.
  • Recht­sklick in die Über­schrift Index und im Kon­textmenü wählen Sie dann Andere Spal­ten ent­piv­otieren.
  • Weisen Sie der Spalte Wert den Daten­typ Text zu. Das geht entwed­er via Recht­sklick in die Über­schrift oder das Reg­is­ter Start | Daten­typ.
  • Wech­seln Sie zum Reg­is­ter Spalte hinzufü­gen und wählen Sie das Sym­bol Benutzerdefinierte Spalte.
  • Geben Sie hier bei Neuer Spal­tenname den Text Werte ein.
  • Bei Benutzerdefinierte Spal­tenformel tra­gen Sie diese Formel ein:
    = Text.Remove([Wert], ZuLoeschendeZeichen)
    und bestäti­gen mit OK.
  • Löschen Sie nun die Spalte Wert (die, wo noch die Buch­staben enthal­ten sind).
  • Markieren Sie die Spalte Attrib­ut.
  • Weisen Sie der Spalte Werte den Daten­typ Dez­i­malzahl zu, da es ja immer noch Texte sind (was an der links­bündi­gen Aus­rich­tung auch erkennbar ist).
  • Wech­seln zu zum Reg­is­ter Trans­formieren und wählen Sie Piv­otieren  aus.
  • Als Wertes­palte wählen Sie Werte.
  • Klick­en Sie auf Erweit­erte Optio­nen und wählen im Kom­bi­na­tions­feld die unter­ste Möglichkeit Nicht aggregieren. Mit OK schließen Sie den Dia­log.
  • Löschen Sie nun die erste Spalte Index.
  • Schließen & laden, und die Dat­en wer­den in ein neues Tabel­len­blatt in eine Liste / Tabelle geschrieben.

Damit ist die Auf­gabe prinzip­iell erfüllt. Soll­ten Sie die (wirk­lich) leeren Zellen irri­tieren oder stören ste­ht es Ihnen natür­lich frei, diese beispiel­sweise direkt nach dem Ent­piv­otieren durch eine 0 zu erset­zen. – In der Excel-Tabelle kön­nen Sie nun mit der Tabel­len­funk­tion­al­ität die Sum­men bilden, oder was Sie son­st noch mit den Zahlen berech­nen oder anfan­gen wollen. – Und ja, Sie kön­nten auch diesen Schritt in Pow­er Query erledi­gen lassen…  😎


Ergänzung von Anfang Novem­ber 2019

Begin­nend in Excel 2019 und natür­lich in Excel 365 gibt es eine weit­ere, aus mein­er Sicht dur­chaus ele­gan­tere Möglichkeit, das gewün­schte Ziel zu erlan­gen.

Über das Menü Trans­formieren erweit­ern Sie das Sym­bol Textspalte. Dort wählen Sie Spalte teilen und im Drop­Down Klick­en Sie dann in die Auswahl Nach Wech­sel von Nicht-Zif­fer zu Zif­fer. Dadurch wer­den eine oder mehrere Spal­ten, jew­eils begin­nend mit den Zif­fern neu erstellt. Diese Zahlen-Spal­ten kön­nen Sie nun noch ein­mal auf dem gle­ichen Wege so teilen, dass sie im let­zten Schritt Nach Wech­sel von Zif­fer zu Nicht-Zif­fer auswählen. Anschließend wer­den sie all jene betrof­fe­nen Spal­ten löschen, die nur Text enthal­ten. Diese Lösungsmöglichkeit hat auch den aus­ge­sprochen großen Vorteil, dass eine Zelle, die mehrere Zahlen­fol­gen (durch Text getren­nt) enthält, „sauber” aufgeteilt wird. 😎

▲ nach oben …

Rück­mel­dun­gen / Feed­back gerne per Mail an mich (G.Mumme@Excel-ist-sexy.de)

Hat Ihnen der Beitrag gefallen?
Erleichtert dieser Beitrag Ihre Arbeit?

Dann würde ich mich über einen Beitrag Ihrer­seits z.B. 2,50  freuen … (← Klick mich!)

Dieser Beitrag wurde unter Allgemein, Verschiedenes, Datentyp anpassen, Entpivotieren, Foren-Q&A, Kreuztabelle, Power Query, PQ-Formeln (Sprache M), Text-Behandlung, {Liste} abgelegt und mit , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.