Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Parsen nach Datum (https://www.delphipraxis.net/199576-parsen-nach-datum.html)

zongo-joe 2. Feb 2019 16:10

Parsen nach Datum
 
Habe zum PArsen meiner Kontoauszüge eine Funktion geschrieben, um ein Datum in einem String zu suchen:

auch kein Highlight des eleganten Codens, aber funzt:

Delphi-Quellcode:
function datumsuchen(x:string; trenner:char; erstes,meldung,streng:boolean):string;
  // sucht ein Datum in x
  // trenner = trennzeichen zB . oder /
  // erstes = true = erstes vorhandenes Datum suchen, sonst letztes
  // meldung = Message, wenn kein Datum gefunden wird
  // streng = Jahr muss mindestens 2stellig sein (delphi akzeptiert auch einstellig)
  // Rückgabewert wenn kein Datum geunden wird ist leer

  var gefunden:boolean;
      posi:integer;
      res:string;

  function suchdatum (x:string; posi:integer):string;
    // posi = erstes trennzeiche, darum herum wird das datum gesucht
    var res:string;
         posi2,anz,i:integer;
         fehler:boolean;
         test : tdate;

    begin
      res:='';
      fehler:=false;

      // erst nach links alle zeichen kopieren, die zahlen oder trenner sind
      posi2:=posi;
      while (posi2 > 0) and (x[posi2] in [trenner,'0'..'9']) do begin
        res := x[posi2] + res;
        dec(posi2)
      end;


      // dann nach rechts alle zeichen kopieren, die zahlen oder trenner sind
      posi2:=posi+1;
      while (posi2 <= length(x)) and (x[posi2] in [trenner,'0'..'9']) do begin
        res := res + x[posi2];
        inc(posi2)
      end;


      // jetzt prüfen, ob genau 2 trenner vorhanden sind
      anz:=0;
      for i:=1 to length(res) do if res[i]=trenner then inc(anz);
      if anz <> 2 then fehler:=true;

      // jetzt prüfen, ob es sich um ein gültiges datum handelt
      try
        if not fehler then test := strToDate(res);
      except fehler:=true; end;

      if fehler then result:='' else result:=res;

    end; // von function suchdatum



  begin
    gefunden:=false;


    if length(x) > 0 then begin

      if erstes then begin // erstes gültiges Datum suchen

        posi:=1;
        while (not gefunden) and (posi <= length(x)) do begin
          if x[posi] = trenner then begin
            res := suchdatum(x,posi);
            if res <> '' then gefunden := true;
          end;
          inc(posi);
        end;

      end else begin // letztes gültiges Datum suchen

        posi:=length(x);
        while (not gefunden) and (posi >0 ) do begin
          if x[posi] = trenner then begin
            res := suchdatum(x,posi);
            if res <> '' then gefunden := true;
          end;
          dec(posi);
        end;

      end;

    end; // von if length(x) > 0

    // prüfung of bei streng mindestesn 2stellige jahreszahl
    if gefunden and streng then begin
      posi:=length(res)+1;
      repeat
        dec(posi);
      until (posi=0) or (res[posi]=trenner);
      if posi > length(res)-2 then begin
        gefunden := false;
        res:='';
      end;

    end;

    if (not gefunden) and meldung then showmessage('Kein gültiges Datum in '+x+' gefunden.');

    result:=res

  end; // von function datumsuchen
Aufruf zB mit:
showmessage(datumsuchen('Der Mops hopst am 1.1.2019','.',true,true,true));

TurboMagic 7. Feb 2019 19:51

AW: Parsen nach Datum
 
Was willst du uns damit sagen? Oder wolltest du einfach diesen Quellcode dem allgemeinen Publikum dankenswerterweise zur Verfügung stellen?

generic 8. Feb 2019 12:51

AW: Parsen nach Datum
 
Hallo zongo-joe,

schöne Routine und war bestimmt sehr aufwendig diese zu Testen und zu entwickeln.
Hast du schon Mal von Regulären Ausdrücken gehört?
Mit diesen kann man ganz prima Dinge suchen in dem man Regeln vorgibt.

Beispiel:
44.55.6666

Wenn du das Suchen willst, dann wäre der Suchstring z.B. \d{2}\.\d{2}\.\d{4}
Das kann man dann noch verfeiner, um z.B. zu sagen, dass der Monat nur 0 oder 1 in der ersten Stelle haben kann.
\d{2}\.[01]\d\.\d{4}

Jahreszahl 2 oder 4 stellig:
\d{2}\.[01]\d\.(\d{2}){1,2}

Gibt da wirklich viele tolle Möglichkeiten.

https://regex101.com/

https://www.regular-expressions.info/

TurboMagic 9. Feb 2019 15:40

AW: Parsen nach Datum
 
Um das RegEx Thema zu komplettieren: Delphi hat eine RegEx Klasse irgendwo in der RTL mit drin.
Ich weiß jetzt nur nicht wie die heißt und wie man die benutzt, sondern nur, dass es diese gibt.

mkinzler 9. Feb 2019 16:53

AW: Parsen nach Datum
 
http://docwiki.embarcadero.com/Libra...larExpressions


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.

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