Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Buchstaben Kette in Klammern erkennen (https://www.delphipraxis.net/199544-buchstaben-kette-klammern-erkennen.html)

Trafel21 31. Jan 2019 07:20

Datenbank: firebird • Version: 2.5 • Zugriff über: Delphi XE

Buchstaben Kette in Klammern erkennen
 
Hallo zusammen,

ich würde gern eine Buchstabenfolge in Klammern per SQL erkennen.

In einem STRING steht folgendes: '0333 333333 (Stadt) 0444 44444 (Dorf) 3434343 ...'

Jetzt würde ich gern vor jeder Buchstabenfolge in einer Klammer ein ^ vorsetzen:

REPLACE(:ISTRING,' ([[:ALPHA:]]*) ','^([[:ALPHA:]]*)');

In der Firebird Dokumentation steht:

Zitat:

'Icaque' similar to '[[:ALPHA:]]*' -- true
Eigentlich sollte es funktionieren aber... tut es nicht.

Trafel21 31. Jan 2019 08:02

AW: Buchstaben Kette in Klammern erkennen
 
Okay, hab mein Fehler erkannt,[[:ALPHA:]] funktioniert nur bei similar to. :oops:

Trafel21 31. Jan 2019 09:55

AW: Buchstaben Kette in Klammern erkennen
 
Ich hab es jetzt so versucht...

Code:
    IF (:ISTRING SIMILAR TO '([[:ALPHA:]äöüÄÖÜß]*)' ) THEN
    begin
      IString = REPLACE(:IString,')',')^');
    end
Leider ist die Bedingung immernoch nicht Wahr, weiß jemand warum?

Moombas 31. Jan 2019 10:32

AW: Buchstaben Kette in Klammern erkennen
 
Du könntest alternativ generell vor Jede Klammer ein ^ setzen, wenn ichs richtig verstehe ist das ja genau das was du willst.

Dafür gibt es Stringreplace:

Delphi-Quellcode:
  String := '(123)(456)';
  IString := stringreplace(IString, '(', '^(',[rfReplaceAll, rfIgnoreCase]);
  //Ergebnis: ^(123)^(456)

DeddyH 31. Jan 2019 10:53

AW: Buchstaben Kette in Klammern erkennen
 
Es geht um Firebird, nicht um Delphi. Klar könnte man da auch ganz stumpf mit REPLACE vor jede öffnende Klammer das ^ setzen, allerdings wäre das dann ohne jede Prüfung.

Trafel21 31. Jan 2019 10:55

AW: Buchstaben Kette in Klammern erkennen
 
Zitat:

Zitat von Moombas (Beitrag 1424490)
Du könntest alternativ generell vor Jede Klammer ein ^ setzen, wenn ichs richtig verstehe ist das ja genau das was du willst.

Dafür gibt es Stringreplace:

Delphi-Quellcode:
  String := '(123)(456)';
  IString := stringreplace(IString, '(', '^(',[rfReplaceAll, rfIgnoreCase]);
  //Ergebnis: ^(123)^(456)

In den Klammern dürfen nur Wörter stehen. (Martin) -> ^(Martin)
Bei Zahlenfolgen Bspw, (030) soll nicht passieren.

Meine Spaltenwert sehen meistens so aus.

0361-333333 (Martin) 030-432432 (Stefan)

Ich darf explizit nur Buchstaben innerhalb einer Klammer stehen, alles andere nicht. Bspw. Können die Vorwahlen auch in Klammern stehen, die sollen nicht bearbeitet werden.

Moombas 31. Jan 2019 11:29

AW: Buchstaben Kette in Klammern erkennen
 
sry, dachte das dies über die normale Programmierung ging also Daten aus Datenbank holen, verarbeiten und wieder rein schieben und nicht direkt über den DB Zugriff.

Sonst hätte man es ja recht simpel so lösen können:
Delphi-Quellcode:
procedure XYZ();
var
 i, j   : integer;
 IString : string;
 inhalt : string;
begin
  IString := '0361-333333 (Martin) (030)-432432 (Stefan)';
  for i := 1 to length(IString) do //für die länge des ganzen Strings nach der Klammer suchen
  begin
    if (IString[i] = '(') and (IString[i-1] <> '^') then //Wenn die Klammer gefunden wurde und diese nicht schon ersetzt wurde weiter machen
    begin
      inhalt := ''; //Inhalt zurücksetzen
      j := i + 1;  //Nach der ( Inhalt auslesen
      while IString[j] <> ')' do // ) wurde gefunden
      begin
        inhalt := inhalt + IString[j]; //Inhalt der Klammer auslesen
        inc(j);
      end; // Inhalt der gefundenen Klammern steht fest
      try
        strtoint(inhalt); //Kann der Inhalt in eine Zahl umgewandelt werden?
      except //Nein? Dann ist es ein String und ersetze ( durch ^(
        IString := stringreplace(IString, '('+inhalt+')', '^('+inhalt+')', []);
      end;
    end;
  end;
  Showmessage(IString); // Ergebnis: 0361-333333 ^(Martin) (030)-432432 ^(Stefan)
end;

Trafel21 31. Jan 2019 12:29

AW: Buchstaben Kette in Klammern erkennen
 
Danke für deine Hilfe und deinen Aufwand Moombas, leider bin ich im SQL unterwegs und schreibe eine Procedur. In SQL gibt es keine for schleifen, was ich ziemlich behämmert finde. :lol:

Eine ähnlcihe logik hatte ich zusammengebaut.

Code:
I=0;
NUMBER_C = '';
NUMBERS = '';
    while (:I<CHAR_LENGTH(:IN_NUMBERS)) do // String durchgehen
    begin
      I=:I+1;
      NUMBER_C = SUBSTRING(:IN_NUMBERS FROM :I FOR 1);
     
      if (NUMBER_C SIMILAR TO '(') then // Wenn ( gefunden
      begin
        NUMBERS = :NUMBER_C; -- ( auslesen
        I=:I+1;

        while (:I<CHAR_LENGTH(:IN_NUMBERS)) do // weitere while schleife für Buchstaben
        begin
          IF (:NUMBER_C SIMILAR TO '[[:ALPHA:]äöüÄÖÜß]') THEN // Wenn Zeichen ein Buchstabe ist...
          begin
            NUMBERS = NUMBERS || :NUMBER_C; // Nach der ( Buchstabeninhalt auslesen

            IF (:NUMBER_C SIMILAR TO '`') THEN // Wenn ) gefunden
            begin
              NUMBERS = NUMBERS || :NUMBER_C; -- ) auslesen

              IN_NUMBERS = REPLACE(:IN_NUMBERS,NUMBERS,NUMBERS||'^'); // zur Trennung ^ setzen
            end
          end
          else
          begin
          break; /* break aus der while, keine Buchstabe */
          end
        I=:I+1;
        end
      end
    end
Hier funktioniert nur das if (NUMBER_C SIMILAR TO '(') nicht. Es kommt ein Fehler "Invalid SIMILAR TO pattern".

Ziemlich verzweifelnd. :?

mkinzler 31. Jan 2019 12:39

AW: Buchstaben Kette in Klammern erkennen
 
Zitat:

In SQL gibt es keine for schleifen, was ich ziemlich behämmert finde.
In PSQL schon (SP, Trigger, execution block)

Delphi.Narium 31. Jan 2019 13:01

AW: Buchstaben Kette in Klammern erkennen
 
Zitat:

Zitat von Trafel21 (Beitrag 1424499)
Hier funktioniert nur das if (NUMBER_C SIMILAR TO '(') nicht. Es kommt ein Fehler "Invalid SIMILAR TO pattern".

Ziemlich verzweifelnd. :?

bei den anderen Ifs schreibst Du
Delphi-Quellcode:
if (:NUMBER_C SIMILAR TO
Fehlt da nur ein Doppelpunkt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz