Entwickler-Ecke

Sonstiges (Delphi) - ASCII Text Parsen


Aya - Mi 29.01.03 01:01
Titel: ASCII Text Parsen
Hi,

gibt es eine schnellere Methode um ASCII Text zu Parsen als mit Copy(), Pos() und Delete()...??

Au'revoir,
Aya


Delete - Mi 29.01.03 01:34

Pack den text in eine Variable vom Typ PChar und geh dann durch, in dem du den Zeiger inkrementierst.

Folgender Code extrahiert E-Mail-Adressen aus einen Text:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.GetEMails;
var
  MailAddy: String;
  p: PChar;
  Start: PChar;
begin
  p := PChar(Memo1.Text);
  while p^ <> #0 do
  begin
    { '@' gefunden }
    if p^ = #64 then
    begin
      { zurückgehen bis ein Leerzeichen oder Zeilenumbruch kommt }
      while (p^ <> #32) and (p^ <> #13) and (p^ <> #10) do
        Dec(p);
      { Anfang gefunden -> merken }
      Start := p+1;
      { eine Schritt nach vorne gehen, sonst hängen wir }
      p := p+1;
      { wieder nach vorne gehen bis zum nächsten Leerzeichen }
      while (p^ <> #32) do
        Inc(p);
      { gefunden }
      SetString(MailAddy, Start, p-Start);
      ListBox1.Items.Add(MailAddy);
    end;
    Inc(p);
  end;
end;

Ist schon älter. keien Ahnung für wen ich das mal gemacht habe.


Aya - Mi 29.01.03 01:36

Zeiger Inkremen... was??? :oops:


Delete - Mi 29.01.03 01:39

inkrementieren, erhöhen. Was meinst du, woher der Name von Inc() herkommt.


Aya - Mi 29.01.03 01:43

achsoooo...... :oops: :oops: :oops:


matze - Mi 29.01.03 13:24

also bevor du mit POS() copy() usw rumstöpelst würd ich das so machen wie luckie in seinem besp test gezeigt hat.

wenn du allerdings nur wörter suchst bist du mit pos() recht gut bedient !!!


Sivar - Mi 29.01.03 13:30

@Luckie:

Beim Überfliegen des Codes ist mir was aufgefallen:

Quelltext
1:
2:
3:
4:
5:
      ...
      { wieder nach vorne gehen bis zum nächsten Leerzeichen } 
      while (p^ <> #32) do 
        Inc(p); 
      ...


Wenn die E-Mail jetzt aber am Ende des Textes ist, gibt es evtl. kein #32 mehr!? An dieser Stelle sollte auch auf #0 abgefragt werden.

Gruß
Sivar


Delete - Mi 29.01.03 13:32

Der Code war nur für jemanden schnell zusammen gekloppt. :roll: