Entwickler-Ecke

Sonstiges (Delphi) - Nur bestimmte Daten eines Strings auslesen lassen.


Rattergott - Di 17.05.05 14:28
Titel: Nur bestimmte Daten eines Strings auslesen lassen.
Hallo leutes,
ich habe ein Problem.

nehmen wir an ich hätte einen string s mit dem inhalt: xyz http://google.de qvc ard http://web.de php
aus diesem string möchte ich jetzt die webadressen, die unbekannt sind abba alle mit http:// anfangen herausfiltern.
wie mache ich das?

MfG
Ratter


JoelH - Di 17.05.05 14:41
Titel: hmm,
Mach einfach ne Whileschleifen.

zunächst suchst du nach POS('http://',string) und POS(' ',string) was dazwischen steht das ist eine URL, die liest du aus und danach löschst du alles aus string bis zur Position des Leerzeichens.

Das machst du solange bis POS('http://',string) nichts mehr findet bzw. string einfach leer ist.


Rattergott - Di 17.05.05 14:50

das problem ist ich hab keine ahnugn von delphi, kannst du mir da mit nem beispiel programm helfen?


JoelH - Di 17.05.05 15:08
Titel: hmm,
da gibbet kein Beispielprogramm, da gibbet nur ne Lösung und dafür ist das Board nicht da bzw. meine Zeit zu begrenzt. Ein wenig Eigeninitiative sollte schon vorhanden sein.


Rattergott - Di 17.05.05 18:28

kann mri nciht irgendwer helfen? BITTTE


Fabian W. - Di 17.05.05 18:34

Is das Übung? Wenn ja, dann mustt du's schon selbver schreiben, sonst bringt das nix.
Oder is es für n Programm? Muss es unbedingt so eien Formatierung sein. Es gibt da viel bessere Möglichkeiten, n paar INfos mehr wären nicht schlecht.


feivel3333 - Di 17.05.05 20:52
Titel: Web-Adressen herausfiltern
Hi,
wo auch immer du diesen seltsamen String herhast - an Deiner Stelle würde ich das folgendermaßen lösen:
Baue dir ein Array auf, das aus Strings besteht. Aber von nicht fest definierter Größe.

z.B. asAdressen : array of string;

Nun musst du eine Schleife programmieren, die die Leertasten findet und dort den String zerschneiden.

solange eine Leertaste gefunden wird

d.h. pos( ' ', csAdressenliste ) > 0

führe folgendes durch:

Vergrößere das Array um ein Element,
schnibbel vorn von csAdressenliste ein Element bis zur Leertaste ab
füge die abgeschnibbelte Adresse in das Array ein.
Das letzte Element von csAdressenliste packst du einfach zusätzlich an das Array hinten an.
Warum, das wirst du schon noch merken.

Nun gehe einfach das Array von hinten nach vorn durch und prüfe, ob das jeweilige Element mit http anfängt. Wenn nein, lösche das Element.

Fertig ist die Liste.

Wenn du mir verrätst, wo die Adressenliste herkommt, vielleicht fällt mir dann was Leichteres ein. Ist sie wirklich so seltsam aufgebaut und beinhaltet Word-Mischmasch?

Gruß, AS


J.Borchert - Di 17.05.05 21:08

Das ist so etwas was feivel3333 meinte:


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:
25:
26:
27:
28:
29:
30:
31:
function StrX(Trenner:Char; s:string; x:integer):string//Sucht X-ten String in s
var a   :array of string
    i,j :integer; 
    t   :string;
begin t:=Trim(s);
        for i:=1 to length(t) do // innerhalb von " " = ‡
         if t[i]='"' then
          begin t[i]:=Trenner;
           for j:=i+1 to length(t) do
             begin if t[j]=Trenner then t[j]:='‡';
                   if t[j]='"' then begin t[j]:=Trenner; break; end;
             end;
          end;
      setLength(a,1);
    while length(a) <= x do
     begin
      for i:=1 to length(t) do
        if t[i]<>Trenner then 
          a[length(a)-1]:=a[length(a)-1]+t[i] else
            if t[i-1]<>trenner then setLength(a,length(a)+1);
      if i>length(t) then break;
     end;
    if x>length(a) then result:='' else
      result:=StringReplace( a[x-1], '‡', Trenner, [rfReplaceAll]);

(* StrX(' ',s,6) ergibt 'Tag 7'
   StrX(' ',s,2) ergibt '34'

   s = 12.23 34 21.2 22.34 23434,45 "Tag 7" 234.9878 H
*)

end;



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
...
var i:integer;
    schtringliste:TStringList;
 for i:=1 to MaxWorteInZeile do if uppercase(StrX(' ',Zeile,i))='HTTP://' then
   schtringliste.add(StrX(' ',Zeile,i));
...


MaxWorteInZeile muß Du natürlich als Zahl angeben oder ermitteln :twisted:

Wenn einer weiß, wie's besser und schneller geht, bitte posten...

mfG Jürgen


feivel3333 - Di 17.05.05 21:48

Also, es ist fertig:


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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
procedure TMainForm.BitBtn6Click(Sender: TObject);

var csAdressen   : string;
    csTeilString : string;
    niPos        : integer;
    niLang       : integer;
    asAdressen   : array of string;

    // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

    procedure ADel( niPosition : integer );

    var niI      : integer;
        niLength : integer;


    begin
       niLength := length( asAdressen )-1;
       if niLength < niPosition then exit;

       if niPosition = niLength then begin
          // Letztes Element abschneiden:
          SetLength( asAdressen, niLength );
          exit;
       end;

       for niI := niPosition to niLength-1 do begin
          asAdressen[ niI ] := asAdressen[ niI+1 ];
          Application.ProcessMessages;
       end;
       SetLength( asAdressen, niLength );
    end;

    // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

begin
   csAdressen := 'xyz http://google.de qvc ard http://web.de php';
   csAdressen := trim( csAdressen ) + ' ';

   while true do begin
      Application.ProcessMessages;
      niPos := pos( ' ', csAdressen );
      if niPos = 0 then break;

      if niPos = length( csAdressen ) then begin
         // Endstück erreicht:
         niLang := length( asAdressen );
         SetLength( asAdressen, niLang+1 );
         asAdressen[ niLang ] := trim( csAdressen );
         break;
      end;

      csTeilString := copy( csAdressen, 1, niPos-1 );
      niLang := length( asAdressen );
      SetLength( asAdressen, niLang+1 );
      asAdressen[ niLang ] := csTeilString;

      csAdressen := copy( csAdressen, niPos+1, length( csAdressen ) - niPos );
   end;

   // Bereinigung von asAdressen:
   niLang := length( asAdressen )-1;

   for niPos := niLang downto 0 do begin
      Application.ProcessMessages;
      if pos( 'HTTP://', AnsiUpperCase( asAdressen[ niPos ] ) ) = 0 then
         adel( niPos );
   end;
end;


Ich habe den ganzen Spaß auf einem ButtonClick ausführen lassen und festgestellt, dass es funktioniert.
Hoffentlich hilft es dir weiter.

Gruß, Feivel


Rattergott - Mi 18.05.05 00:07

die frage ist jetzt:

wie ich sehe nimmst du alle adressen in asAdressen auf.
wie gebe ich den ein array in einem memofeld aus?


Benutzername - Mi 18.05.05 00:58

Etwa so:

Delphi-Quelltext
1:
2:
for i := 0 to length(asAdressen)-1 do
 Memo1.Lines.Add(asAdressen[i]);


JayEff - Mi 18.05.05 01:35

tja. jetzt macht er "markieren, STRG+C, STRG+V, F9" und sagt "juhu! ich hab ein Programm geschrieben!"... soll heißen: wo is der Lerneffekt? ausserdem hätt ich das mit ner stringlist, CommaText und StringReplace gemacht. da muss man sich die explode funktion nich mal selber schreiben.

Delphi-Quelltext
1:
2:
3:
4:
5:
with TStringList.Create do
begin
CommaText:=StringReplace(Edit1.Text, ' '',' , [rfReplaceAll]);;
Memo1.Text:=Text;
end;

getestet.
Und last but not least soll man die Suche benutzen. Es gibt schätzungsweise 10 Themen die sich mit Explode funktionen beschäftigen, da wett ich (fast :wink:) drauf.

Aber gut, Hier is das Thema ja wohl eindeutig durch. ^^


Rattergott - Do 19.05.05 00:01

also nur so zur info, der bereich den ich hierraus übernommen habe, ist kenntlich gemacht und ich klaue nicht sondern weise auf die quelle hin.

und danke. hat geklappt!


JayEff - Do 19.05.05 00:45

neiiiiiiiiiiiiiiiiiin so hab ichs nicht gemeint :shock: ich meinte: du hast doch dabei nix gelernt, weil du nix weiter tun musstest, als kopieren! Ich will dir doch nix vorwerfen :shock: Das DF ist doch dazu da, um Hilfe zu bekommen, das hat nix mit klauen zu tun!


Rattergott - Do 19.05.05 12:24

doch ich blicke zwar durch das programm oben nciht durch ........ abbbba ich habe gelernt, wie man das mit dem memo feld macht!


feivel3333 - Do 19.05.05 13:07
Titel: Programm verstehen
Hi,
wenn du das Programm oben nicht verstehst, das jetzt aber auf deinem PC korrekt läuft, dann würde ich, um es zu begreifen, mit dem Debugger durchwandern und das Array genau untersuchen. Du kannst es dir ja auch in die Liste der zu beobachtenden Elemente legen und bei jedem Schritt mit F7 bzw. F8 begutachten.

Hilft für das Verständnis bestimmt weiter. Und da dort auch die Variablentypen eindeutig zu erkennen sind, dürfte es nicht allzu schwierig sein.


Gruß, Feivel