![]() |
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); . . |
Re: Text durchsuchen
Hi,
schau Dir mal PosEx an. |
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? |
Re: Text durchsuchen
![]() ![]() |
Re: Text durchsuchen
Zitat:
Ich hab mit Pos immer nur die erste Email bekommen, aber mit PosEx funktioniert es jetzt ! |
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; |
Re: Text durchsuchen
Hi!
Wie sieht denn dein Ausgangstext aus und wie genau das Ergebnis? Und wie der Aufruf? Ciao, Frederic |
Re: Text durchsuchen
...der Aufruf erfolgt so....
Delphi-Quellcode:
die Datei hat folgenden Inhalt (ich die tatsächlichen Emails etwas abgeändert, dient nur zu Testzwecken ):
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; 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 |
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 |
Re: Text durchsuchen
...hab ich auch schon gedacht
wenn ich aber 1 Zeichen abziehe, dann fehlt bei manchen Emails ein Zeichen
Delphi-Quellcode:
Datei
....
.... Mytext:= Copy (aValue,start+1,(stop-start-1)); .... 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 !!!! |
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: ![]() Ein Aufruf könnte ungefähr so aussehen (ich habe das nur anhand des Beispiels aus der CL zusammengetippt):
Delphi-Quellcode:
Wie gesagt, das ist komplett ungetestet, doch ich könnte mir vorstellen, dass es in der Art funktioniert.
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; Grüße, Matze |
Re: Text durchsuchen
Hi!
Fehlt das Zeichen immer nur, wenn es quasi auch das letzte Zeichen der Datei war? Ciao, Frederic |
Re: Text durchsuchen
Zitat:
Immer wenn das Zeichen das letzte Zeichen in der Datei ist , fehlt es ! Ansonsten kein Fehler mehr ! |
Re: Text durchsuchen
Hi!
Dann sollte diese Veränderung wohl die gewünschte Lösung sein:
Delphi-Quellcode:
Ciao, Frederic
while (... stop <= length(aValue)
|
Re: Text durchsuchen
Zitat:
Weil diese Schleife (und die davor übrigens auch) Zitat:
Besser:
Delphi-Quellcode:
P.S. Dann aber beim Copy() bitte nichts mehr abschneiden ;)
stop := at;
while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do begin Inc (stop) end; |
Re: Text durchsuchen
Ja, Danke für die Hilfe !
An diesem Fehler hab ich jetzt schon 2 Tage rumgebastelt ! :wall: |
Re: Text durchsuchen
Also dieser Code ist arg bösartig:
Delphi-Quellcode:
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.stop := at; while (aValue[stop+1] in permittedChar) and (stop < length(aValue)) do begin Inc (stop) end; 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); |
Re: Text durchsuchen
Zitat:
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 ); |
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:
Und schlate ruhig die Bereichsprüfung ein ;)
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 ); P.S. "funktioniert nicht" ist irgendwie ne doofe Fehlerbeschreibung ;) |
Re: Text durchsuchen
Zitat:
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. |
Re: Text durchsuchen
Versuch doch noch mal diesen Code (die Zuweisung zu MyText war geringfügig falsch):
Delphi-Quellcode:
Ü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...
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); |
Re: Text durchsuchen
Zitat:
Allerdings hab ich , wie oben empfohlen die Abfragen vertauscht
Delphi-Quellcode:
Ich muß jetzt nur noch die doppelten Einträge (Emails) rausfiltern
stop := at;
while (stop < length(aValue)) and (aValue[stop+1] in permittedChar) do begin Inc (stop) end; |
Re: Text durchsuchen
Zitat:
|
Re: Text durchsuchen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz