Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1808to1812
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

RegEx und seine Geheimnisse - Teil 2

RegEx und seine Geheimnisse - Teil 2
28.01.2021 19:11:38
Siegfried
Ja im April 2020, glaube ich war es, hat mir bezüglich RegExp Sulprobil (Bernd P) etwas auf die Sprünge geholfen, ist aber nach wie vor ein spanisches Dorf für mich.
Nun habe mich neuerlich wieder etwas damit beschäftigt und die Abfragen doch da und dort etwas anpassen / ergänzen können um somit weinige Werte, die er nicht gelesen hat zu verarbeiten.
Ich habe mir dann die Spalte „Rest“ angelegt in welcher ich durch WECHSELN alle Werte aus den einzelnen RegExp-Spalten von der Spalte X herausnehme, so dass am Ende ja nur mehr die Trennzeichen „;“ übrig sein sollten/müssten.
Wenn Teile in den Spalten Name, Ort, Adresse z.B. auch vorkommen bleiben die natürlich in der Spalte Rest auch übrig, ist aber nachvollziehbar.
Nur das in einigen Spalten RedExp nicht korrekt arbeitet verstehe ich einfach nicht und finde auch nicht die Ursache dafür, sind alle in blau markiert.
Da die Original Datei über 23.000 Datensätze enthält, dauert eine Auswertung doch etwas verdammt lange, die Frage, ob man das nicht doch etwas beschleunigen könnte?
Oder ob es möglich wäre, bei/nach Korrekturen in der Spalte X z.B. eine Abarbeitung nur zeilenweise oder spaltenweise durchlaufen zu lassen, den die meisten Fehler lagen bei den TelNr. Wo von vorneherein das + fehlte oder die TelNr durch - und / oder . getrennt war. Das könnte man Großteils auf das schnelle ändern und müsste nur die Spalte TelNr. Mit RegExp durchlaufen lassen.
Hätte es mit einer Schlaufe versucht, dabei wurde Regexp aber leider, nicht so, wie wenn ich in die Bearbeitungsleiste klicke und dann Return drücke, ausgelöst.
Nun und eines der Hauptprobleme waren z.B. vorkommende Zeichen bei der Vielfalt von Ländern, die nicht ASCI entsprechen siehe Word-Datei, musste ich alle ändern, da ich den WEG sie in den RegExp-abfragen einzubauen nicht gefunden habe.
Bei hineinkopieren in die Abfrage wurde nur das/ein ? dargestellt, für mich der Hinweis das es nicht verstanden wird.
Die Gesamten Daten sind im Format UTF-8 erstellt da ja die meisten Navi-Softwaren diese verlangen.
Hoffe es kann mir da jemand helfen.
Gruß Siegfried
https://www.herber.de/bbs/user/143390.xlsm
https://www.herber.de/bbs/user/143391.doc

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: warum RegEx
28.01.2021 21:23:26
Fennek
Hallo,
nach einem kurzen Blick in die xlsm:
wenn die Daten aus einer Webseite kommen,
- kann man sowohl das Thema UTF8
- die Zuordnung aus der html-Struktur auslesen
mfg
AW: warum RegEx
28.01.2021 22:09:59
Siegfried
Hallo Fennek,
DANKE das du mal einen Blick darauf geworfen hast.
Direkt aus einer Webseite stammen sie nicht, sie sind zwar über das WEB heruntergeladen aber als fertige Daten für ein bestimmtes Navi-Format und aus diesem extrahiert ins lesbare UTF-8 Format.
Und dann mit RegExp in die Einzelteile zerlegt.
Nun kann/könnte ich sie eben in einer neuen Zusammenstellung für meinen Bedarf neu erstellen.
LG Siegfried
Anzeige
AW: Text-in-Spalten
28.01.2021 23:01:33
Fennek
Als ersten Schritt scheint ein "Text-in-Spalten" möglich, danach müßte ein Makro die Unstimmigkeiten korrigieren.
AW: RegEx und seine Geheimnisse - Teil 2
29.01.2021 00:34:49
Yal
Hallo Siegfried,
RegEx lässt sich leichter zähmen, wenn man seinen Pattern auf Test-Seite wie Regex101.com zuerst plausibilisiert.
Die große Schwierigkeit deiner Datensatz ist, dass viele Zwischenfelder fehlen.
Ich habe ein relativ gute Ergebnis mit folgenden Code erreicht (verbesserungswürdig, wirst Du sehen).
Da ich meistens nur die Anwesenheit ( "", ausser bei Email) hätte ich nur den RegExp.Test verwenden sollen. Wäre "günstiger" gewesen. Test + Execute ist doppel teuer.
Sub Splitter()
Dim i, j
Dim Arr
Application.ScreenUpdating = False
For i = 2 To 601
Arr = Split(Cells(i, 1), ";")
'PLZ und ort
Cells(i, 2) = Arr(0)
'Gästewertung
j = 1
If InStr(1, Trim(Arr(j)), "Gästewertung", vbTextCompare) = 1 Then
Cells(i, 3) = Arr(j)
j = j + 1
End If
If UBound(Arr)  "" Then
Cells(i, 4) = Trim(Arr(j))
j = j + 1
End If
If UBound(Arr)  "" Then
Cells(i, 6) = Trim(Arr(j))
j = j + 1
End If
If UBound(Arr)  "" Then j = j + 1
If UBound(Arr)  "" Then
Cells(i, 9) = Trim(Arr(j))
j = j + 1
End If
Nächster:
Next
Application.ScreenUpdating = True
End Sub
Private Function RegEx(Text, Pattern, Optional Occurence = 0) As String
'mit Extras, Verweise.. auf Microsoft VBScript Regular Expressions 5.5 (besser zu debugen)
Dim R As New RegExp
Dim ergs As Object
'    Set R = CreateObject("vbscript.regexp")
R.ignorecase = True
R.Pattern = Pattern
Set ergs = R.Execute(Text)
If ergs.Count > 0 Then RegEx = Trim(ergs(0).submatches(Occurence))
End Function
Viel Erfolg
Yal
Anzeige
AW: RegEx und seine Geheimnisse - Teil 2
29.01.2021 11:18:05
Siegfried
Hallo Yal,
bin kein guter VBA-Anwender, habe es aber versucht deinen Vorschlag umzusetzen.
Bis zur Gästewertung bin ich gekommen, dann erfolgt der erste Aufruf von RegExp, dieser brachte mir eine Fehlermeldung, siehe Bild. Verstehe leider zu wenig um das zu lösen.
LG Siegfried
Userbild
Userbild
AW: RegEx und seine Geheimnisse - Teil 2
29.01.2021 13:39:31
Yal
Hallo Siegfried,
steht -leider gut versteckt- in der grünen auskommentierten Zeile in dem Sub:
im VB-Editor auf Extras gehen, Verweise,
dann die angegebene Library ankacken: Microsoft VBScript Regular Expressions
Damit kannst Du alle Objekte aus diese Library als Dim deklarieren. Es ist dann die Alternativ zu deine erste Codezeile mit "CreateObject".
VG
Yal
Anzeige
AW: RegEx und seine Geheimnisse - Teil 2
31.01.2021 08:42:23
Siegfried
Morgen Yal!
DANKE für den Hinweis, habe ich kurz darauf gefunden und aktiviert!
Gefällt mir sehr gut deine Vorschlag, läuft super und auch schnell, habe s mit meiner großen Datenbank bereits versucht, 23.700 Datensätzen, hat es 9.3 Minuten gedauert dann war er fertig damit.
Der erste Fehler der mal gleich aufgetreten ist, war wo nur z.B. [AT-4055] Testplatz [Testort] vorhanden ist, das es bei der split-Anwendung sofort einen Fehler gab. Habe daher alle " [" durch "; [" ersetzt somit war das erledigt. Nun funktioniert mir aber leider die Straßen und Ortauswertung nicht mehr.
Hätte mehreres versucht, aber leider zu wenige Erfahrung/Wissen über RegExp und nicht gelungen.
dort wo nur einmal ein ";" vorhanden ist wurde der Ort ausgelesen, wenn mehrere ";" sind leider weder die Straße noch der Ort.
Hier war es OK
  • [AL-xxxx] Natura Bar Restaurant Camping; Gästewertung: 3.6 (5); [Termal]

  • Hier aber leider nicht mehr, aber eben nur die beiden letzten Werte!
  • [AL-1501] KRUJE CAMPING; Gästewertung: 5 (1); krujecamping@gmail.com; Street Abaze; [Kruje]

  • Die Abfrage dazu sieht so aus,
          'Strasse = Spalte M
    Cells(i, 13) = RegEx(Arr(j), "(\w+\@\S+)")
    If Cells(i, 13)  "" Then j = j + 1
    If UBound(Arr)  "" Then
    Cells(i, 14) = Replace(Replace(Trim(Arr(j)), "[", ""), "]", "")
    j = j + 1
    End If
    

    Vielleicht hättest/könntest du mir bitte eine Lösung vorschlagen, DANKE
    LG Siegfried
    Anzeige
    AW: RegEx und seine Geheimnisse - Teil 2
    01.02.2021 09:15:45
    Yal
    Hallo Siegfried,
    Ein Semikolon kann es gar nicht geben, weil diese durch den Split (trennt eine Zeichenkette in ein Array) als Trenner verwendet, und somit "gelöscht" werden.
    Das Schwierigkeit bei Dir liegt daran, die Regel rauszufiltern, die ein 100% Ergebnis liefert, weil die Eingabe, wenn auch ähnlich, nicht immer gleich sind.
    Es wird wahrscheinlich keine ein-Regel Lösung, sondern viele Ausnahmebehandlung geben.
    VG
    Yal
    AW: RegEx und seine Geheimnisse - Teil 2
    03.02.2021 11:02:43
    Siegfried
    Hallo Yal
    Habe nun mal in einem ersten durchlaufen alles was auf Fremdzeichen hinweist durch entsprechende ASCI-Zeichen ersetzt, dann alle doppelten Leerzeichen durch einfache, alle "; (00", usw. bei den TelNr. ersetzt, wodurch die Fehleranzahl sich um vieles gebessert hat.
    Bei den TelNr. habe ich eigentlich nur mehr Probleme wenn weder ein " +" bzw. " 0" vorhanden ist, also die TelNr. mit " 0-9" beginnen kann, wie kann ich das Abfragen ohne da jetzt für jede Möglichkeit von 1 -9 extra abzufragen.
    Nach wie vor hänge ich bei der Straßen und Ortauswertung.
    Wie findet er beim Ort das dies mit [ und ] versehen ist, im Wort selbst aber natürlich alles von [A-Za-z0-9_] vorkommen kann aber auch . - / möglich sind, irgendwie greift die jetzt verwendete RegEx leider nicht.
    Oder liegt es daran, das er auch in der Straße keine Auswertung hat und somit j nicht erhöht wird.
    Kann man mit RegEx eigentlich auch von Rückwärts suchen, wie ginge das?
    Bei Daten die z.B. nur aus 2 bis 3 ";" bestehen und auch keine Straße vorhanden ist wird der Ort sehr wohl ausgewertet, daher meine Vermutung wegen j.
    LG Siegfried
    Anzeige
    AW: RegEx und seine Geheimnisse - Teil 2
    03.02.2021 13:45:33
    Yal
    kopiere ein Paar Telefonnummer in der Testfenster bei regex101.com und teste verschiedene RegeEx.
    (\+|0)(\d*)
    könnte ein guter Starpunkt sein, um ein telefonnummer zu testen
    VG
    Yal
    AW: RegEx und seine Geheimnisse - Teil 2
    04.02.2021 00:08:58
    Siegfried
    Hi Yal
    Nun dein Hinweis auf "regex101.com" ist ein teilweiser Lichtblick was RegEx betrifft für mich.
    Obwohl mit 76 Jahren Englisch ja gerade nicht meine Stärke ist, habe es zwar auf German eingestellt aber alles wird ja nicht übersetzt daher doch noch sehr viele unbekannte für mich.
    Wie du aus angehängtem Bild ersehen kannst, habe ich einmal versucht das mit den Ortsnamen zu lösen, finde aber nicht mit welcher Abfrageeinstellung er - Bindestriche und / Querstriche akzeptiert, bleibt mir bis jetzt ein Rätsel. Bei [Bourg-St-Pierre] hat er sie angenommen beim Vorletzten Ort aber nicht?
    Mit der Einstellung Python 2.7 brachte er das beste Ergebnis, ist das eigentlich im VBA verwendbar?
    VG Siegfried
    Userbild
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige