Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Suche Hilfe für Stringverarbeitung mit Copy und Pos ... (https://www.delphipraxis.net/97559-suche-hilfe-fuer-stringverarbeitung-mit-copy-und-pos.html)

MoYo 12. Aug 2007 22:02


Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Hallo.
Nach langer Zeit wieder mal ein Beitrag von mir.
Es geht hier darum, dass ich eine Textdatei ausgelesen habe.
Diese wurde in ein String geschrieben damit ich damit arbeiten kann.

Die Textdatei ist von einer Datenbank. Deshalb steht alles in einer Zeile.
Ich brauche dort alle E-Mails wirklich alle.

Beispiel:
INSERT INTO bb1_users VALUES ('01', 'MoYo','pw','pw','MoYo64@hotmail.de','

So gehts halt immer weiter.
Ich habe mir überlegt, dass ich bis zum @ suchen lasse.
Danach von dort aus runter gehe bis zum '.
Von dem ' gehts wieder hoch bis zum nächsten '.
Und das halt was dazwischen liegt kopiere.

Natürlich muss ich die kopierten ... irgendwo reinschreiben.
Müsste mit Arrays möglich sein.

Dies wird halt so oft gemacht bis nix mehr da ist.

Habe zwar eine Idee ... aber keine Ahnung wie ich es lösen soll.

Hoffe, dass es etwas verständlich ist und ihr mir helfen könnt.

MFG,
MoYo

mkinzler 12. Aug 2007 22:05

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Ich würde anhand der Kommas trennen.

MoYo 12. Aug 2007 22:09

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Zitat:

Zitat von mkinzler
Ich würde anhand der Kommas trennen.

Das würde auch gehen.
Wie gesagt ich kann mir zwar vorstellen was ich machen kann ...
aber weiß einfach nicht wie ...

...
Habe jetzt etwas weiter überlegt.

Position := Pos(SubStr, S);

Hiermit bestimme ich die Position vom 1. @.
Es hat die Position = 144.

Wie kann ich damit mit PosX das , oder ' davor suchen lassen.

Dann könnte ich ja die Position vom , oder ' bestimmen lassen.
Mit dem Suche ich dann das nächste , oder '.

Somit wüsste ich dann meine 1. E-Mail.
Kopieren lassen. In Array schreiben und das nächste suchen.

Jetzt gehts zur Umsetzung aber wie :D

mkinzler 12. Aug 2007 22:20

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Delphi-Quellcode:
p := 0;
for i := 1 to 4 do
    p := PosEx( ',', s, p);

Apollonius 12. Aug 2007 22:30

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Boing. Falscher gehts kaum, mkinzler.
Zitat:

Delphi-Quellcode:
p := 0;
for i := 1 to 4 do
    p := PosEx( ',', s, p);

Das muss heißen:
Delphi-Quellcode:
p := 1;
for i := 1 to 4 do
    p := PosEx( ',', s, p+1);
Sonst wird beim ersten mal Null zurückgegeben, weil der Offset Null ist, und wenn man das behoben hat, wird jedesmal das gleiche gefunden, deshalb p+1.

MoYo 12. Aug 2007 22:38

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
p := 0;
for i := 1 to 4 do
    p := PosEx( ',', s, p);

sicher, dass es so funktioniert ?
Sucht der nicht hier mit das nächste , ?
Es wäre aber wichtig zuerst das , vor dem @ zu finden und danach erst das , nach dem @

Apollonius 12. Aug 2007 22:44

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Nimm wenn, dann bitte meinen Code!
Der sucht die Position des vierten Kommas, und zwischen dem vierten und dem fünften Komma steht doch die EMail-Adresse!?

TBx 12. Aug 2007 22:44

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Zitat:

Zitat von MoYo
Die Textdatei ist von einer Datenbank.

Hast Du Zugriff auf diese Datenbank?
Meines Erachtens wäre es wesentlich sinnvoller, die Möglichkeiten des Datenbanksystems zu nutzen, um an die einzelnen Email-Adressen zu kommen. In der DB werden diese ja wohl nicht in einem einzigen Datenfeld eines einzigen Datensatzes stehen.

Gruß

onlinekater

mkinzler 12. Aug 2007 22:45

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Er sollte auch das davor finden, wenn man meine Fehler korrigiert

MoYo 12. Aug 2007 22:46

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Zitat:

Zitat von onlinekater
Zitat:

Zitat von MoYo
Die Textdatei ist von einer Datenbank.

Hast Du Zugriff auf diese Datenbank?
Meines Erachtens wäre es wesentlich sinnvoller, die Möglichkeiten des Datenbanksystems zu nutzen, um an die einzelnen Email-Adressen zu kommen. In der DB werden diese ja wohl nicht in einem einzigen Datenfeld eines einzigen Datensatzes stehen.

Gruß

onlinekater

Leider habe ich nur noch dieses letzte Backup.
Ich weiß, dass es z.B. mit PHP ohne Probleme geht so wie ich es mir denke.
Will aber auch mit Delphi klar kommen.

grenzgaenger 13. Aug 2007 00:53

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
wie wär's mit 'n kleinen schleifchen?

Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE}
uses sysutils;

function getEMailAddy(s: string): string;
var
 i: integer;
 KommaCount: integer;
 quoted: boolean;
begin
 quoted    := false;
 result    := '';
 KommaCount := 0;
 for i := 1 to length(s) do
 begin
  if s[i] = '''' then quoted := not quoted;
  if not quoted and (s[i] = ',') then
  begin
   inc(KommaCount);
   if KommaCount > 4 then break;
   continue;
  end;
  if (KommaCount = 4) and (s[i] <> '''') then
   result := result + s[i];
 end;
end;

var
 s: string = 'INSERT INTO bb1_users VALUES (''01'', ''MoYo'',''pw'',''pw'',''MoYo64@hotmail.de'','' ';
begin
 writeln(GetEMailAddy(s)); //teststring
 readln;
end.
damit umgehste das problem,dass in einem PW auch mal ein oder mehrere kommas sein können... ausserdem brauchste den string nur einmal durchlaufen. sollte daher recht flott gehen...
grüsse
gg

marabu 13. Aug 2007 09:27

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Guten Morgen,

hier noch eine Funktion, welche auch mit maskierten Apostrophen fertig wird:

Delphi-Quellcode:
function ExtractValue(const s: string; index: Integer): string;
const
  PREFIX = '(';
  SUFFIX = ')';
  QUOTE = '''';
var
  iStart, iLength: Integer;
begin
  with {Classes.}TStringList.Create do
  begin
    iStart := Succ(Pos(PREFIX, s));
    iLength := Pos(SUFFIX, s) - iStart;
    CommaText := Copy(s, iStart, iLength);
    if index < Count
      then Result := {SysUtils.}AnsiDequotedStr(Strings[index], QUOTE)
      else Result := '';
    Free;
  end;
end;
Grüße vom marabu

SurfDuDe 13. Aug 2007 10:18

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Das würde ich unbedinngt mit Regular Expressions und TRegExpr lösen:

http://www.regexpstudio.com/DE/TRegExpr/Help/About.html


Delphi-Quellcode:
// Diese einfache Funktion extrahiert alle E-Mail-Adressen aus dem InputString
// und legt eine Liste dieser Adressen in den Rückgabewert
function ExtractEmails (const AInputString : string) : string;
const
   EmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+'
var
   r : TRegExpr;
begin
   Result := '';
   r := TRegExpr.Create; // Erzeuge Objekt
   try // garantiere Speicherfreigabe
      r.Expression := EmailRE;
      // der R.A. wird automatisch in die interne Struktur übersetzt
      // innerhalb der Zuweisung an diese Eigenschaft
      if r.Exec (AInputString) then
         REPEAT
            Result := Result + r.Match [0] + ', ';
         UNTIL not r.ExecNext;
      finally r.Free;
   end;
end;

begin
   ExctractEmails ('My e-mails is [email]anso@mail.ru[/email] and [email]anso@usa.net[/email]');
   // gibt zurück: 'anso@mail.ru, [email]anso@usa.net[/email], '
end.

MoYo 13. Aug 2007 10:44

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Zitat:

Zitat von SurfDuDe
Das würde ich unbedinngt mit Regular Expressions und TRegExpr lösen:

http://www.regexpstudio.com/DE/TRegExpr/Help/About.html


Delphi-Quellcode:
// Diese einfache Funktion extrahiert alle E-Mail-Adressen aus dem InputString
// und legt eine Liste dieser Adressen in den Rückgabewert
function ExtractEmails (const AInputString : string) : string;
const
   EmailRE = '[_a-zA-Z\d\-\.]+@[_a-zA-Z\d\-]+(\.[_a-zA-Z\d\-]+)+'
var
   r : TRegExpr;
begin
   Result := '';
   r := TRegExpr.Create; // Erzeuge Objekt
   try // garantiere Speicherfreigabe
      r.Expression := EmailRE;
      // der R.A. wird automatisch in die interne Struktur übersetzt
      // innerhalb der Zuweisung an diese Eigenschaft
      if r.Exec (AInputString) then
         REPEAT
            Result := Result + r.Match [0] + ', ';
         UNTIL not r.ExecNext;
      finally r.Free;
   end;
end;

begin
   ExctractEmails ('My e-mails is [email]anso@mail.ru[/email] and [email]anso@usa.net[/email]');
   // gibt zurück: 'anso@mail.ru, [email]anso@usa.net[/email], '
end.

Diese Arbeitsweise kenne ich von PHP. Wundervoll, dass jemand auch so etwas für Delphi gemacht hab.
Ich werde es damit testen. Ich danke euch allen :) Sollte ich Probleme haben sag ich bescheid.

Luckie 13. Aug 2007 10:45

Re: Suche Hilfe für Stringverarbeitung mit Copy und Pos ...
 
Und was spricht gegen ExplodeExplode aus der Code-Lib?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz