Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit Pos + Copy


susi_777 - Mo 23.07.07 16:23
Titel: Problem mit Pos + Copy
Hallo zusammen,

habe leider als Anfänger einige Probleme eine Email einzulesen.
Der Aufbau des Textes in der Email ist:

Mitgliedsname: golfspieler
Name: Ludwig Meier
Straße: Rosengarten 21
Ort: usw.

Bei dem Versuch nur die Daten (golfspieler, Ludwig Meier, Rosengarten 21, usw.) in einzelne Felder zu extrahieren, hänge ich an der Festlegung der Begrenzung, daß heißt, bis wie weit nach dem gefunden Suchstring in das Feld kopiert werden soll.
Meine Idee zum Auslesen des Mitgliedsnamen "golfspieler" war, dass nächste eindeutige Feld (Name:) als Begrenzer zu nehmen und dann 5 Zeichen zu subtrahieren - aber das funktioniert leider nicht.
Mein fehlerhafter Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
Email_Volltext := Memo1.Text;
suche_nach := 'Mitgliedsname:';
suche_bis := #13#10+'Name:';  // da ich golfspieler auslesen möchte, wollte ich bis zum nächsten eindeutigen Suchstring begrenzen
NewString := '';
NewString := Copy(Email_Volltext, Pos(suche_nach, Email_Volltext)+39, Pos(suche_bis, Email_Volltext)-5);


Kann mir bitte jemand helfen?
Danke und Gruß
Susi


Wonko - Mo 23.07.07 16:45


Delphi-Quelltext
1:
Copy(S; Index, Count: Integer)                    

Count ist die Anzahl der Zeichen. Du übergibst aber die Position des letzten Zeichens, versuche es mal so:

Delphi-Quelltext
1:
NewString := Copy(Email_Volltext, Pos(suche_nach, Email_Volltext)+39, Pos(suche_bis, Email_Volltext)-5-Pos(suche_nach, Email_Volltext))                    

jetzt sollte der richtige Wert für Count übergeben werden.
Die 39 hat sicher einen Sinn, oder?

Ansonsten solltest Du der Übersicht halber lieber ein paar Variablen mehr definieren, die Du später rausnehmen kannst, wenn alles funktioniert.


Calculon - Mo 23.07.07 16:55

Hi,

warum nicht eine TStringlist benutzen?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
var
email: TStringlist;
i: integer;
suche_nach, new_string: string;
begin
  email := TStringlist.Create;
  email.loadfromfile('Email_Volltext.txt'); // <-- das was in deiner Memo1 steht als
                                            //     Textdatei abgespeichert
  suche_nach := 'Mitgliedsname:';
  new_string := '';
    for i := 0 to email.count - 1 do
      begin
        if Ansipos(suche_nach, email.strings[i]) <> 0 then
          begin
            // folgendes kopiert den String beginnend von der Länge von suche_nach + 1
            // bis zur Länge von email.strings[i])
            new_string := copy(email.strings[i], length(suche_nach) + 1, length(email.strings[i]));
            break;
          end;
      end;
  ShowMessage(new_string);
end;


Ist ungetestet, dürfte aber so oder so ähnlich funktionieren.

Gruß

Calculon


bflegel - Mo 23.07.07 17:04

Oder einfach so (getestet): :wink:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Button1Click(Sender: TObject);
var
email_volltext : string;
suche_nach : string;
suche_bis: string;
NewString : string;
begin
Email_Volltext := Memo1.Text;
suche_nach := 'Mitgliedsname:';
suche_bis := 'Name:';  // da ich golfspieler auslesen möchte, wollte ich bis zum nächsten eindeutigen Suchstring begrenzen
NewString := '';
NewString := Copy(Email_Volltext,
                  Pos(suche_nach, Email_Volltext)+15,       // Beginn des Wortes (Länge 15 = 'Mitgliedsname: ')
                  Pos(suche_bis, Email_Volltext)-(2+Pos(suche_nach, Email_Volltext)+15));  // Länge 2 = #13#10
showmessage (Newstring);
end;

end.


bye bflegel


susi_777 - Mo 23.07.07 17:16

@bflegel, Calculon, Wonko - hat geklappt, vielen Dank und beste Grüße
Susi