AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parsen nach Datum

Ein Thema von zongo-joe · begonnen am 2. Feb 2019 · letzter Beitrag vom 9. Feb 2019
Antwort Antwort
zongo-joe

Registriert seit: 8. Jun 2007
8 Beiträge
 
Delphi 7 Professional
 
#1

Parsen nach Datum

  Alt 2. Feb 2019, 16:10
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));
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#2

AW: Parsen nach Datum

  Alt 7. Feb 2019, 19:51
Was willst du uns damit sagen? Oder wolltest du einfach diesen Quellcode dem allgemeinen Publikum dankenswerterweise zur Verfügung stellen?
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Parsen nach Datum

  Alt 8. Feb 2019, 12:51
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/
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.815 Beiträge
 
Delphi 12 Athens
 
#4

AW: Parsen nach Datum

  Alt 9. Feb 2019, 15:40
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Parsen nach Datum

  Alt 9. Feb 2019, 16:53
http://docwiki.embarcadero.com/Libra...larExpressions
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 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