Free Trial

Forum - Deutsch

Suchen Sie nach Antworten, stellen Sie Fragen und teilen Sie Ihr Alteryx-Wissen.
GELÖST

Positionsbestimmung mit Variable

MarcusHopf
Asteroid

Liebes Alteryx-Forum,

 

mit der Formel "REGEX_Match" konnte in einem String konnte eine Angabe gefunden werden. Nun wird die Position der Variable benötigt.

 

Fallbeispiel:
Syntax für Dateinamen: NAME_BERICHTSJAHR_ZEITSTEMPEL.CSV

String1: "Marcus Hopf_2020_20220613-085959.csv"

String2: "Hopf_2019_20220613.csv"

String3: "Hopf Marcus_2018_20220613-085959.csv"

 

Formel 1: REGEX_Match("Marcus Hopf_2020_20220613-085959.csv", ".*\_d{4}_.*") = 0

 

Mit der Formel FindString("Marcus Hopf_2020_20220613-085959.csv", "_2020_") erhalte ich 11.

 

Gibt es eine Möglichkeit die Position des Strings "_BERICHTSJAHR_" variabel zu bestimmen? Beispielsweise mit Platzhalter?

 

Mit der Formel FindString("Marcus Hopf_2020_20220613-085959.csv", "_20"**"_") war ich leider nicht erfolgreich.

6 ANTWORTEN 6
grossal
15 - Aurora
15 - Aurora

Hallo Markus,

 

ich würde mal vermuten, dass es dein eigentliches Ziel ist, die drei Informationen von einander zu trennen und in separate Spalten aufzuteilen.

Die einfachste Variante wäre wahrscheinlich komplett ohne Regex einfach mit Text-To-Columns:

 

grossal_0-1655106074942.png

 

Als Trennzeichen würden wir hier dann ein Underline (_) Zeichen verwenden. Ähnliches könnten wir selbstverständlich auch mit Regex erreichen (und ich würde das lieben), aber dies wäre deutlich schlechter zu warten für Leute die Regex nicht verstehen.

 

Hilft dir das schon weiter, oder willst du wirklich genau die Position vom Jahr bestimmen?

 

Viele Grüße

Alex

MarcusHopf
Asteroid

Hallo grossal,

 

schon einmal ganz herzlichen Dank für die Mithilfe zur Findung einer Lösung.

 

Für das beschriebene Problem ist es ein Lösung die funktioniert.

 

Eine gangbare Lösung für mein eigentliches Problem ist leider noch nicht so ganz, da die Benennung der Dateien von der beschriebenen Syntax auch abweichen kann. Jedoch ist das "_BERICHTSJAHR_" immer enthalten, jedoch nicht immer an der zweiten Stelle von Rechts oder Links. Dies war in meiner ursprünglichen Beschreibung auch nicht enthalten.

 

Beispiel:

1: "Marcus Hopf_2020_20220623_085959.csv"

2. "PowerBI_Marcus Hopf_2020_20220623_085959.csv"

3. "PowerBI_Ausg_2020_Marcus Hopf_20220623_085959.csv"

 

Gibt es eine Möglichkeit nach "_ZAHLZAHLZAHLZAHL_" mit FindString zu suchen? Damit beispielsweise wie im dritten Beispiel der Teilstring ..."_Ausg_"... übersprungen wird?

 

Alternativ dachte ich auch noch bei FindString beim gesuchten Text nach Platzhaltern. "_20??_" (?? für 18, 19, 20). Nur nach "_20" ist leider auch keine vollständig gangbare Möglichkeit, weil dann im String "_20.Baustelle_" fälschlicherweise gefunden werden könnte.

 

Ich persönlich bin halt leider zu doof um eine Art "REGEX_MATCH_POSITION" zu schreiben. 😓

grossal
15 - Aurora
15 - Aurora

Hallo @MarcusHopf,

 

FindString erlaubt dir leider nicht nach einem Schemata zu suchen, daher würde ich dir in dem Fall Recht geben und über Regex nachdenken. Die Lösung ist tatsächlich auch relativ simple und kann mit dem Regex-Tool und der Option "Parse" erfolgen:

 

grossal_0-1655114508682.png

 

Das Ergebnis sieht dann so aus:

grossal_1-1655114526124.png

 

 

 

Wieso weshalb warum?

 

Deine Hauptanforderung GENAU vier Zahlen zwischen zwei Underlines zu finden decken wir mit folgendem ab:

 

_(\d{4})_

 

\d steht für eine Zahl von 0-9

Mit den geschweiften Klammern {} können wir spezifizieren wie viele es davon geben soll - in unserem Fall genau 4.

Mit () geben wir an, dass wir genau diesen Teil extrahieren wollen der diese Bedingungen erfüllt.

Das Underline davor und danach nutzen wir um Regex mitzuteilen, dass vor und nach unseren vier Zahlen immer ein Underline stehen muss.

 

Würden wir den Ausdruck alleinstehend haben - so würde er nicht funktionieren, weil wir nur solche Texte parsen würden die genau aus diesen Zeichen bestehen. Wir müssen daher noch ein .* davor und danach einfügen, dadurch sagen wir Regex "Fange mit etwas beliebigem an, bis du ein Schema triffst, das aus einem Underline, vier Zahlen und einem Underline besteht und danach mit etwas beliebigem endet" - Falls du dies findest, so extrahiere bitte die vier Zahlen.

 

Der vollständige Ausdruck sieht daher wie folgt aus:

 

.*_(\d{4})_.*

 

 

Viele Grüße

Alex

MarcusHopf
Asteroid

Hallo grossal,

 

ganz herzlichen Dank für die schnelle und ausführliche Hilfe und Erläuterung.

 

In meinem spezifischen Fall habe ich es auch mal mit einer Schleife im Formel-Tool versucht. Diese funktioniert, aber auch nur bedingt, wenn der gesuchte String von der rechten Seite aus gesehen eine fixe Position hat. 

[FileName] = "Marcus Hopf_2020_20220613-085959.csv"

IF REGEX_Match([FileName], ".*_\d{4}.*") THEN Substring([FileName],Length([FileName])-24,4) ELSE "" ENDIF
MarcusHopf
Asteroid

Ich hatte die Formel leider falsch kopiert. 😃

[FileName] = "Marcus Hopf_2020_20220613-085959.csv"

IF REGEX_Match([FileName], ".*_\d{4}_.*") THEN Substring([FileName],Length([FileName])-24,4) ELSE "" ENDIF
grossal
15 - Aurora
15 - Aurora

Ich glaube nicht, dass wir es mit Substring wirklich dynamisch hinbekommen, da wir die Position unserer Jahreszahl nur äußerst schwer (falls möglich) bestimmen können. Mir fällt hier Ad-Hoc auch kein Weg an dies zu machen.

 

 

Alternativ fällt mir gerade noch ein Kniff ein mit dem man komplett auf Regex verzichten könnte. Wir gehen zurück zum Text-To-Column Tool, splitten diesmal allerdings in Zeilen auf.

 

grossal_0-1655124560835.png

 

grossal_1-1655124579479.png

 

 

Danach können wir mit einem Filter aufräumen, als Bedingung habe ich hier folgendes gewählt:

 

Length([Feld]) == 4 AND ToNumber([Feld]) != 0

 

Zunächst prüfen wir ob das Feld 4 Zeichen hat und danach ob das Konvertieren in eine Zahl ungleich 0 ist - wieso? Wenn wir "Hopf" (welches die erste Bedingung erfüllt) in eine Zahl konvertieren , so wird es mit "0" übersetzt, daher müssen wir das noch abfangen. Selbstverständlich könnten wir im Filter auch folgendes nehmen wenn wir zurück zu Regex wollen.

 

REGEX_MATCH([Feld],'\d{4}')

 

Aber das wäre dann doch langweilig ;-)

 

Info: Die Funktion "IsNumber()" können wir leider nicht verwenden, da IsNumber() auch bei 2020 fehlschlagen wird, weil lediglich der Metadaten-Typ überprüft wird und dieser ist leider String, daher habe ich mich oben mit dem Trick durch ToNumber bedient.

 

 

Viele Grüße & einen guten Start in die Woche

Alex

Beschriftungen