Autor Beitrag
GBrainI
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Do 27.08.09 16:36 
Hallo erstmal,

Ich habe folgendes Problem:

Ich möchte aus einer Text Datei (Editor) auf meinem Desktop, die ganzen Emailadressen welche sich in der Textdatei befinden(unzählig viele) raussuchen lassen und in eine neue Editor Datei reinschreiben lassen. Quasi nur die Emailadressen untereinander aufgelistet bekommen.

da in der Eingabedatei alles aneinander geschriebeni ist und weder mit, noch ; sondern mit " die wörter voneinander getrennt sind wäre es sinvoll ein @ zeichen zu suchen und darauf hin nach links bis zum " und rechts bis zum '.' dann wieder bis zum " zu suchen und die Emailadresse somit rausgefiltert in die neue editor zeilen einzufügen.

aber weis nicht ob dieser Ansatz richtig ist, geschweige denn ob das so einfahc geht. bin noch ein "Neuling" bezüglich Delphi 5 enterprise.

hat jemand ne gute idee ?

(am bestne direkt mit ner guten Source)

danke schonmal


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Do 27.08.2009 um 18:01
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Do 27.08.09 16:51 
einmal, schreib dir Pseudocode um deinen Algo herauszufinden, dann weisst du, ob es überhaupt funzt.

Brauchst du Befehle um Dateien zu verwenden oder um den Algo auszuführen?

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Do 27.08.09 22:14 
Hi :)

Zunächst einmal musst du deinen Text aus der Datei laden. Dazu benötigst du den vollständigen Dateipfad, beispielsweise 'C:\Dokumente und Einstellungen\..\Desktop\Emails.txt'. Wenn sich die Datei nicht an einem festen Ort befindet, musst du ihn entweder mit einem TOpenTextFileDialog finden, oder aber relativ zu einem bestimmten Ordner(Pfad zu Eigene Dateien, .. lässt sich ermitteln -> Suche) danach suchen. Nun verwendest du TStringlist.LoadFromFile, um an den Textinhalt zu kommen.

Da doch nicht immer ganz klar ist, welche Schritte nun genau benötigt werden, wäre demnächst eine kleine Liste der dir Schwierigkeiten bereitenden Teilaufgaben gut :)

Wenn du wirklich vor nicht allzu langer Zeit zu Programmieren begonnen hast und noch keine Zählschleife selbst schreiben kannst, rate ich dir doch nochmal zu einem oder zwei Tutorials. Den hier mal besucht? Crashkurs von Christian S..

Wenn dir aber die generellen Möglichkeiten, wie etwa eine Schleife, bereits in ein paar Anwendungsfällen bekannt sind, solltest du das Folgende auf jeden Fall nicht übernehmen, sondern lieber selbst entwickeln:

Um das @ zu finden, gehst du den String aus der Textdatei mit einer Zählschleife durch und gehst bei Erfolg mit zwei weiteren Zählschelifen jeweils nach links und rechts. Am besten, du liest meinen Code und deaktiviert mal schnell die Tasten [Strg]+[c]. Wenn du ihn verstanden hast, schreibst du alles einmal selbst und vergleichst am Ende - so lernst du wahrscheinlich am meißten dabei :)

ausblenden Delphi-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:
procedure ExtractEmailAdresses(const S: String);  //S wird nicht verändert, daher ein const. sonst ein var davor, sonst kopiert der Compiler den String zuerst ein weiteres Mal, um das Original unverändert zu halten
var
  aAdressen: TStringlist;
  aAnfang, aEnde: Integer;
  aLen: Integer;
  i: Integer;
begin
  aAdressen := TStringlist.Create;
  aLen := Length(S);
  i := aLen;
  while i <> 0 do begin
    if S[i] = '@' then begin  //wenn an Stelle i ein @ steht,
      aEnde := i;
      while (S[aEnde] <> '.'and (aEnde <> aLen) do
        Inc(aEnde);
      while (S[i] <> '"'and (i <> 1do
        Dec(i);
      aAdressen.Append(Copy(S, i, aEnde));
    end;
    Dec(i);
  end;
  aAdressen.SaveToFile({..});
  aAdressen.Free;
end;


Wenn du dann noch Unterscheide zwischen unseren Versionen finden kannst, entfernst du diese am beten nicht gleich, sondern postest mal deinen Quelltext. Dann können wir dir auch genau erklären, warum an einer bestimmten Stelle nun der Check auf (i <> 1) kommt, und nicht der auf 0, etc.

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)


Zuletzt bearbeitet von Hidden am Di 01.09.09 19:28, insgesamt 1-mal bearbeitet
GBrainI Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Di 01.09.09 10:15 
Das sind wirklich hervorragende Ideen, welche nichtmal schwer bei der Umsetzung erscheinen. Deshalb bedanke ich mich hier schonmal, jedoch gibts auch diesmal wieder eine Frage ... (leider).

Ich kriege 3 Fehlermeldungen :

- Unclear Identifer i,
kann ich es einfach bei Integer reinschreiben ?

-[Warning] Unit1.pas(38): Comparing signed and unsigned types - widened both operands
das ist jeweils bei "do" die fehlermeldung.

und zuletzt noch, dass ich nich genug paramter angegeben hätte...bei button1.

könnt ihr mich aufklären weshalb ich diese fehler meldungen bekomme?
Wie ich diese beheben kann?

In welcher Zeile wird denn meine Datei geladen die gelesen werden soll ?
sie liegt am desktop und heisst einfach test.txt (ist voll mit Emailadressen--sehr unübersichtlich)

danke im voraus.
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Di 01.09.09 22:13 
Hi :)

[Oh, vllt. sollte man seine Posts auch absenden - keine schlechte Idee :D]

Die Deklaration von i fehlte, habe ich ergänzt :) Über die Vergleichswarnung bzgl. Vorzeichenloser/-behafteter Zahlen kann ich nur spekulieren, ich verwende im obigen Code ausschließlich Integer = Integer, Char = Char und Char = Konstante, das kann es alles nicht sein. Auch der Buttonklick kann wohl kaum meinen Source betreffen ;) Kannst du deinen Quelltext mal posten und die betreffenden Zeilen highlighten :?:

Das Laden erfolgt analog zum Speichern und ist im obigen Quelltext nicht enthalten - der Methode wird ja der String übergeben, das heißt du müsstest sie mit dem String aus der Datei aufrufen.

ExtractEmailAdresses(StringlistDateiEins.Text);

Grüße,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
GBrainI Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Mi 02.09.09 10:49 
Danke für die audwendige Information, aber das Problem hat sich erledigt ich machs jetzt mit einem anderen verfahrn.