Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Gleich beginnende Strings zählen (https://www.delphipraxis.net/42931-gleich-beginnende-strings-zaehlen.html)

Jörn 26. Mär 2005 03:54


Gleich beginnende Strings zählen
 
Hallo,

ich habe heute mal wieder echt keinen Plan, wie ich ein Problem angehen soll.
Gegeben ist mir eine Stringlist mit vielen IPs. Diese möchte ich untersuchen nach Häufigkeit in bestimmten Bereichen (im Sinne einer Statistik). Nach dem Bearbeiten möchte ich eine Liste haben wie folgt:

192.168.0.* = 20 IPs
192.168.1.* = 0 IPs
192.168.2.* = 7 IPs

Jemand einen Lösungsansatz für mich?

MfG

derpepe 26. Mär 2005 05:50

Re: Gleich beginnende Strings zählen
 
Liste der Anhänge anzeigen (Anzahl: 3)
Also: Du wolltest einen Ansatz, deshalb hier ein kleines Progrämmchen für Dich.

Es generiert in OnFormCreate 10.000 IPs der Form 192.168.xxx.xxx. Außerdem werden noch 20 IPs der Form 192.169.xxx.xxx generiert.
Man kann jetzt einen gleichbleibenden Anfangsstring eingeben, in unserem Fall "192.168.".

Klickt man auf den Button wird die von Dir gewünschte Statistik erstellt und ausgegeben. Dabei werden IPs die mit "192.168." beginnen gezählt, der Rest (also in unserem Fall 20) werden unter "andere" aufgeführt.

Momentan geht das Programm davon aus, dass nach dem "192.168." drei relevante Zeichen kommen nach denen es die Gruppen bildet. Das erschien mir sinnvoll, da es ja um IPs geht. Aber man kann das ja auch, wenn gewünscht, entsprechend abändern.

Natürlich ist alles noch sehr verbesserungsbedürftig, aber das ist ja auch nur ein Ansatz ;-)

Viel Spaß damit und frohe Ostern!


Der Quelltext (in ListBox1 stehen die IPs, in ListBox2 wird das Ergebnis ausgegeben):
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  anz,laenge,i:integer;
  pname,anfang,gekuerzt:string;
  liste:tstringlist;

  procedure neue_ip(s:string);
  begin
    liste.add(s+': 1');
  end;

  function anzahl_ip(s:string):integer;
  var
    i:integer;
    temp:string;
  begin
    for i:=0 to liste.count-1 do begin
      temp:=copy(liste[i],1,length(s));
      if temp=s then begin
        temp:=liste[i];
        break;
      end;
      temp:='';
    end;
    if temp='' then begin
      anzahl_ip:=0;
    end else begin
      anzahl_ip:=strtoint(copy(temp,pos(':',temp)+1,length(temp)-pos(':',temp)));
    end;
  end;

  procedure update_ip(s:string;anzahl:integer);
  var
    i:integer;
    temp:string;
  begin
    for i:=0 to liste.count-1 do begin
      temp:=copy(liste[i],1,length(s));
      if temp=s then begin
        liste[i]:=s+': '+inttostr(anzahl);
      end;
    end;
  end;

begin
  liste:=tstringlist.create();

  anfang:=edit1.text;
  laenge:=length(edit1.text)+3;

  for i:=0 to listbox1.items.count-1 do begin
    gekuerzt:=copy(listbox1.items[i],1,laenge);
    if copy(gekuerzt,1,laenge-3)=anfang then
      pname:=copy(listbox1.items[i],1,laenge)
    else
      pname:='andere';
    anz:=anzahl_ip(pname);
    if anz=0 then
      neue_ip(pname)
    else
      update_ip(pname,anz+1);
  end;

  listbox2.Items:=liste;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz