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/)
-   -   Delphi Text durchsuchen (https://www.delphipraxis.net/126860-text-durchsuchen.html)

Thomas F 3. Jan 2009 18:26


Text durchsuchen
 
Hallo,

ich möchte ein Memo-Textfeld , in das eine Textdatei geladen wurde, nach einem Zeichen durchsuchen.
Funktioniert auch , aber immer nur ein Zeichen.
Leider findet er immer nur das erste Zeichen und ich blick leider nicht durch ,wie man die Suche fortsetzen kann. :wall:
Es sollen alle im Text befindlichen Zeichen gefunden werden, ich möchte damit die Email-Adressen im Text speichern

Delphi-Quellcode:
memo1.Lines.LoadFromFile(Datei1);
a := pos('@',memo1.text);
memo2.lines.strings[i] := inttostr(a);
.
.

Die Muhkuh 3. Jan 2009 18:27

Re: Text durchsuchen
 
Hi,

schau Dir mal PosEx an.

ULBE01 4. Jan 2009 12:54

Re: Text durchsuchen
 
Hallo!

Das verstehe ich nicht: Hast Du eine Textdatei, in der irgendwo E-Mailadressen stehen und die möchtest Du heraussuchen? Oder nur die Positionen des @? Oder was?

Andreas L. 4. Jan 2009 13:35

Re: Text durchsuchen
 
Reguläre Ausdrücke könntest du dir auch mal anschauen.

http://regexpstudio.com/TRegExpr/TRegExpr.html

Thomas F 4. Jan 2009 16:36

Re: Text durchsuchen
 
Zitat:

Zitat von ULBE01
Hallo!

Das verstehe ich nicht: Hast Du eine Textdatei, in der irgendwo E-Mailadressen stehen und die möchtest Du heraussuchen? Oder nur die Positionen des @? Oder was?

Ja, genau

Ich hab mit Pos immer nur die erste Email bekommen, aber mit PosEx funktioniert es jetzt !

Thomas F 5. Jan 2009 07:23

Re: Text durchsuchen
 
....mit diesem Code hab ich alle Emails aus dem Text rausgefiltert.
Dummerweise erhalte ich bei den Emails immer noch ein Anführungszeichen "
an die Emails drangehängt.
Delphi gibt mir immer wieder neue Rätsel auf :wall:
Dieses Zeichen ist doch gar nicht zulässig
...ich kann keinen Fehler finden.
Frage an die Experten im Forum , wo ist da ein Fehler ????

Delphi-Quellcode:
procedure TForm2.ExtracteMail (aValue : string);
var
  at,p :integer;Mytext:String;
  start : integer;
  stop : integer;
  permittedChar : SET of Char;
begin
p:=1;i:=0;

 repeat
   at:=0;
  permittedChar := ['a'..'z','0'..'9','.','_','-'];
  aValue := AnsiLowerCase(aValue);
  at := Posex('@',aValue,p);
   if at = 0 then exit; // wenn at = 0 dann wurde keine Email gefunden
  p:=at+1;
  start := at-1;
  while (aValue[start] in permittedChar) and (start > 0) do
  begin
    Dec (start)
  end;
  stop := at+1;
  while (aValue[stop] in permittedChar) and (stop < length(aValue)) do
  begin
    Inc (stop)
  end;

Mytext:= Copy (aValue,start+1,(stop-start));
unit13.Form13.memo2.Lines.Add(mytext) ;
 i:=i+1; //zählt die gefundenen Emails

until
at=0;

end;

fkerber 5. Jan 2009 07:31

Re: Text durchsuchen
 
Hi!

Wie sieht denn dein Ausgangstext aus und wie genau das Ergebnis?
Und wie der Aufruf?


Ciao, Frederic

Thomas F 5. Jan 2009 09:08

Re: Text durchsuchen
 
...der Aufruf erfolgt so....

Delphi-Quellcode:
procedure TForm2.Button7Click(Sender: TObject);
var Datei1:String;
begin

if opendialog1.Execute then
begin
Datei1:=opendialog1.FileName;
 unit13.Form13.Show;
memo1.Lines.LoadFromFile(Datei1);
 ExtracteMail (Memo1.text);
  unit13.form13.panel1.Caption:= inttostr(i)+' '+'gefundenen Email-Adressen';
  unit13.Form13.Caption:= Datei1;

end;
end;
die Datei hat folgenden Inhalt (ich die tatsächlichen Emails etwas abgeändert, dient nur zu Testzwecken ):

thomasf.ppppppp@mail.de bbbbbbbbbbfffffffffrrrrrttttttt´+#.mx<thomasf_gggg g@mail.de"kkkkkkkkkkk thomasf_ttttzzzz@mail.com hlfootjhjkgggggggggggggggsssssssssssss"""""ÄÄÄÄÄ thomasf_ggghhhrrr@t-online.de ÄGGGGGGG

das Ergebnis schaut dann so aus :

thomasf.ppppppp@mail.de
thomasf_ggggg@mail.de" <---------- Anführungszeichen :wall:
thomasf_ttttzzzz@mail.com
thomasf_ggghhhrrr@t-online.de

bis auf das Anführungszeichen funktioniert alles einwandfrei

fkerber 5. Jan 2009 09:10

Re: Text durchsuchen
 
Hi!

Du liest vermutlich nach hinten ein Zeichen zu viel, was bei den anderen nicht auffällt, weil hier das folgende Zeichen ein Leerzeichen ist!


Ciao, Frederic

Thomas F 5. Jan 2009 09:20

Re: Text durchsuchen
 
...hab ich auch schon gedacht

wenn ich aber 1 Zeichen abziehe, dann fehlt bei manchen Emails ein Zeichen

Delphi-Quellcode:
....
....
Mytext:= Copy (aValue,start+1,(stop-start-1));
....
Datei

thomasf_tttggg@mail.com
thomasf_rrrrrr@t-mail.de
thomasf.rrrrrrrwwwww@mail.de

Ergebnis :

thomasf_tttggg@mail.com
thomasf_rrrrrr@t-mail.de
thomasf.rrrrrrrwwwww@mail.d <-------------- ein Zeichen fehlt !!!!

Matze 5. Jan 2009 09:21

Re: Text durchsuchen
 
Hallo,

mal ein ganz anderer Ansatz: Du könntest den kompletten String an bestimmten Trennzeichen auftrennen und die dazwischen liegenden Einträge bsp. in eine TStringList schreiben. Die gehst du durch und prüfst auf das @-Zeichen (falls dies zur Feststellung einer E-Mail-Adresse für dich ausreicht.

Da gibt es zum Beispiel diese Prozedur in der Code-Library: Strings trennen.

Ein Aufruf könnte ungefähr so aussehen (ich habe das nur anhand des Beispiels aus der CL zusammengetippt):

Delphi-Quellcode:
procedure ShowEmails(const s: string); // s ist dein dein zu durchsuchender Text (Memo1.Text)
var
  StrList, NewList: TStringlist;
  i: Integer;
begin
  StrList := TStringlist.Create;
  NewList := TStringlist.Create;
  try
    // Hinzufügen aller Trennzeichen
    StrList.Append(',');
    StrList.Append(';');
    StrList.Append('|');
    StrList.Append('"');
    StrList.Append(' ');
    StrList.Append(#13#10);

    DivideString(s, StrList, NewList);

    // Prüfen auf eine E-Mail-Adresse
    for i := 0 to NewList.Count - 1 do
    begin
      // E-Mail-Adressen ausgeben
      if Pos('@', NewList[i]) > 0 then
        ShowMessage(NewList[i]);
    end;
  finally
    FreeAndNil(NewList);
    FreeAndNil(StrList);
  end;
end;
Wie gesagt, das ist komplett ungetestet, doch ich könnte mir vorstellen, dass es in der Art funktioniert.

Grüße, Matze

fkerber 5. Jan 2009 09:38

Re: Text durchsuchen
 
Hi!

Fehlt das Zeichen immer nur, wenn es quasi auch das letzte Zeichen der Datei war?


Ciao, Frederic

Thomas F 5. Jan 2009 09:51

Re: Text durchsuchen
 
Zitat:

Zitat von fkerber
Hi!

Fehlt das Zeichen immer nur, wenn es quasi auch das letzte Zeichen der Datei war?

Ciao, Frederic

STIMMT !

Immer wenn das Zeichen das letzte Zeichen in der Datei ist , fehlt es !
Ansonsten kein Fehler mehr !

fkerber 5. Jan 2009 09:55

Re: Text durchsuchen
 
Hi!

Dann sollte diese Veränderung wohl die gewünschte Lösung sein:

Delphi-Quellcode:
while (...  stop <= length(aValue)
Ciao, Frederic

jfheins 5. Jan 2009 09:55

Re: Text durchsuchen
 
Zitat:

Zitat von Thomas F
Zitat:

Zitat von fkerber
Hi!

Fehlt das Zeichen immer nur, wenn es quasi auch das letzte Zeichen der Datei war?

Ciao, Frederic

STIMMT !

Immer wenn das Zeichen das letzte Zeichen in der Datei ist, fehlt es !
Ansonsten kein Fehler mehr !

Ja.

Weil diese Schleife (und die davor übrigens auch)

Zitat:

Zitat von Thomas F
Delphi-Quellcode:
  stop := at+1;
  while (aValue[stop] in permittedChar) and (stop < length(aValue)) do
  begin
    Inc (stop)
  end;

Aufhört, wenn an der Endposition ein falsches Zeichen gefunden wird, oder das Ende des Textes erreicht wurde. Somit ist bei aValue[stop] immer entweder ein falsches Zeichen oder der Ende des Textes ;)

Besser:
Delphi-Quellcode:
  stop := at;
  while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do
  begin
    Inc (stop)
  end;
P.S. Dann aber beim Copy() bitte nichts mehr abschneiden ;)

Thomas F 5. Jan 2009 10:04

Re: Text durchsuchen
 
Ja, Danke für die Hilfe !

An diesem Fehler hab ich jetzt schon 2 Tage rumgebastelt ! :wall:

Uwe Raabe 5. Jan 2009 11:27

Re: Text durchsuchen
 
Also dieser Code ist arg bösartig:

Delphi-Quellcode:
 
stop := at;
while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do
begin
  Inc (stop)
end;
weil nämlich im Falle von "stop = length(value)" der Zugriff auf "aValue[stop+1]" einen RangeError auslösen sollte (passiert immer dann, wenn eine Mail-Adresse am Ende von aValue steht). Ditto bei der Suche nach dem Anfang der Mail-Adresse. Deswegen soll man ja auch beim Entwicklen und Debuggen diverse Compiler-Flags wie "Bereichsüberprüfung" und "Überlaufprüfung" einschalten.

Besser wäre hier (unter der Annahme, daß "Vollst. Boolesche Auswertung" abgeschaltet ist):

Delphi-Quellcode:
 
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
{ hier steht start vor dem ersten gültigen Zeichen (kann 0 sein) }

stop := at+1;
while (stop <= length(aValue)) and (aValue[stop] in permittedChar) do
begin
  Inc (stop)
end;
{ hier steht stop nach dem letzten gültigen Zeichen (kann length() + 1 sein) }

Mytext:= Copy (aValue, start, stop - start - 1);

Thomas F 5. Jan 2009 14:17

Re: Text durchsuchen
 
Zitat:

Zitat von Uwe Raabe

Delphi-Quellcode:
 
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
{ hier steht start vor dem ersten gültigen Zeichen (kann 0 sein) }

stop := at+1;
while (stop <= length(aValue)) and (aValue[stop] in permittedChar) do
begin
  Inc (stop)
end;
{ hier steht stop nach dem letzten gültigen Zeichen (kann length() + 1 sein) }

Mytext:= Copy (aValue, start, stop - start - 1);

Dieser Code funktioniert leider auch nicht , habs getestet.

Der einzige Code, der mit allen Dateien fehlerfrei funktioniert

Delphi-Quellcode:
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
stop := at;
  while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do
  begin
    Inc (stop)
  end;

Mytext:= Copy (aValue, start+1, stop - start );

jfheins 5. Jan 2009 16:45

Re: Text durchsuchen
 
Aber da hat er schon recht, es wäre besser, wenn du die beiden Abfragen vertauschen würdest.

Also so:
Delphi-Quellcode:
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
stop := at;
  while (stop < length(aValue)) and (aValue[stop+1] in permittedChar) do
  begin
    Inc (stop)
  end;

Mytext:= Copy (aValue, start+1, stop - start );
Und schlate ruhig die Bereichsprüfung ein ;)

P.S. "funktioniert nicht" ist irgendwie ne doofe Fehlerbeschreibung ;)

Thomas F 5. Jan 2009 17:12

Re: Text durchsuchen
 
Zitat:

Zitat von jfheins

P.S. "funktioniert nicht" ist irgendwie ne doofe Fehlerbeschreibung ;)

...mit dem Code hab ich wieder diesselben Probleme.
An die Email wird noch ein Anführungszeichen gehängt, wenn ich ein Zeichen abziehe ,
dann fehlt manchmal wieder ein Zeichen :gruebel:
Ich habs x-mal getestet, der Code oben ist der einzige , bei dem alles funkt.

Uwe Raabe 5. Jan 2009 17:24

Re: Text durchsuchen
 
Versuch doch noch mal diesen Code (die Zuweisung zu MyText war geringfügig falsch):

Delphi-Quellcode:
start := at-1;
while (start > 0) and (aValue[start] in permittedChar) do
begin
  Dec (start)
end;
{ hier steht start vor dem ersten gültigen Zeichen (kann 0 sein) }

stop := at+1;
while (stop <= length(aValue)) and (aValue[stop] in permittedChar) do
begin
  Inc (stop)
end;
{ hier steht stop nach dem letzten gültigen Zeichen (kann length() + 1 sein) }

Mytext:= Copy (aValue, start + 1, stop - start - 1);
Übrigens: hast du mal die Bereichsüberprüfung eingeschaltet? Dann solltest du mit dem bisher als einzig funktionierenden Code nämlich eine Schutzverletzung erhalten, wenn eine Mail-Addresse ganz am Ende des Strings steht...

Thomas F 5. Jan 2009 17:43

Re: Text durchsuchen
 
Zitat:

Zitat von Uwe Raabe
Übrigens: hast du mal die Bereichsüberprüfung eingeschaltet? Dann solltest du mit dem bisher als einzig funktionierenden Code nämlich eine Schutzverletzung erhalten, wenn eine Mail-Addresse ganz am Ende des Strings steht...

Bereichsüberprüfung hab ich eingeschaltet, aber keine Fehlermeldung , auch wenn die Email ganz am Ende der Datei steht :gruebel:

Allerdings hab ich , wie oben empfohlen die Abfragen vertauscht

Delphi-Quellcode:
stop := at;
  while (stop < length(aValue)) and (aValue[stop+1] in permittedChar) do
  begin
    Inc (stop)
  end;
Ich muß jetzt nur noch die doppelten Einträge (Emails) rausfiltern

Uwe Raabe 5. Jan 2009 18:51

Re: Text durchsuchen
 
Zitat:

Zitat von Thomas F
Ich muß jetzt nur noch die doppelten Einträge (Emails) rausfiltern

Ist das jetzt als Frage gemeint?

Thomas F 5. Jan 2009 19:19

Re: Text durchsuchen
 
Zitat:

Zitat von Uwe Raabe
Zitat:

Zitat von Thomas F
Ich muß jetzt nur noch die doppelten Einträge (Emails) rausfiltern

Ist das jetzt als Frage gemeint?

Nee, das ist ziemlich einfach


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 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