Einzelnen Beitrag anzeigen

frieder2008

Registriert seit: 28. Feb 2009
78 Beiträge
 
#1

Einträge in Listview / Stringlist vergleichen;Strings zählen

  Alt 28. Feb 2009, 03:38
Hallo zusammen,

es ist inzwischen sehr spät und ich hänge seit Stunden an einem Problem: Ich habe eine Stringlist mit einzelnen Wörtern (Tokens); diese Tokens möchte ich nun - sofern identisch - zählen und in ein Listview ausgeben (Token + Frequenz).

Leider schaffe ich es weder, im Listview ein Item suchen zu lassen, so dass ich bei einem Neueintrag dann einfach die Frequenz erhöhen könnte (+1), noch schaffe ich es, innerhalb der Ausgangs-Stringlist und in Schleifen die doppelten Tokens zu finden, zu löschen und zu zählen.

Folgendes (mit sicherlich inzwischen mehreren Fehlern, die ich auf Grund von Müdigkeit nicht mehr schnalle) habe ich gezimmert:

Wie ihr seht, hab ich sogar irgendwann aus Hilfslosigkeit mit Goto-Verweisungen zu arbeiten versucht; aber nicht einmal das klappt mehr ^^

Delphi-Quellcode:
procedure TForm1.SpeedButton4Click(Sender: TObject);
var
 untgesamt: integer;
 untfrequenz: integer;
 untwort: array of string;
 listitem: tlistitem;
 Textinhalt: Tstringlist;
 tokenlist: TStringlist;
 i,ii,iii: integer;
begin
  if untfilelist.Items.Count=0 then exit;
  //if reffilelist.Items.Count=0 then exit;

  speedbutton1.Enabled:=false;
  speedbutton2.Enabled:=false;

  {Jede Datei öffnen
  Funktion Tokens isolieren
  Tokens kopieren, falls vorhanden, frequenz erhöhen
  Tokens ausgeben}


  Try
  Textinhalt:= Tstringlist.Create;
  tokenlist:= tstringlist.create;

    // UntFileliste abarbeiten
    for i:=0 to untfilelist.Items.Count -1 do begin

      //File einlesen
      textinhalt.LoadFromFile(untfilelist.Items.Strings[i]);

      // Satzzeichen in Leerzeichen umwandeln
      textinhalt.Text:=stringreplace(textinhalt.Text,'.',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,',',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,';',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'!',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'?',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,':',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'-',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'"',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'(',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,')',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'[',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,']',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'<',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,'>',' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,' ', ' ',[rfReplaceAll, rfIgnoreCase]);
      textinhalt.Text:=stringreplace(textinhalt.Text,' ', ' ',[rfReplaceAll, rfIgnoreCase]);

      //Geladenes File in Tokens zerlegen
      untgesamt:= Extractstrings([' '], [','], pchar(textinhalt.text), tokenlist);

      {Zerlegtes File in Array speichern, allerdings nur jedes Token einmal, zugleich zählen; Lösungsansatz: 1) Wort für Wort durchgehen; 2) bei jedem Wort nach gleichen Ausdrücken suchen; 3) wenn gleich, dann Audruck löschen und Zähler=zähler+1; am Ende direkt in die listbox ausgeben!}

      for ii:=0 to tokenlist.Count -1 do begin //Token der Liste durchgehen & ablesen
          untfrequenz := 1;
          //label Schleife;
          for iii:= ii+1 to tokenlist.count -1 do begin //Dasselbe Token in der Liste durchgehen und suchen
              if tokenlist.Names[ii] = tokenlist.names[iii] then begin // wenn gefunden, dann löschen und zählen
                 tokenlist.Delete(iii);
                 untfrequenz:= untfrequenz + 1;
                 //goto Schleife;
                 end
              else begin //wenn keine gleichen Tokens mehr gefunden werden, dann in Listview abspeichern
                   with untwortliste do begin
                     listitem := items.add;
                     listitem.caption:= tokenlist.names[ii];
                     listitem.subitems.add(inttostr(untfrequenz));
              end;
          end;

    //textansicht.Text :=tokenlist.Text //Test


  Finally
  Textinhalt.Free;
  tokenlist.free;
  end;
Zweck des Ganzen: Texte in ihre Tokens/Wörter zergliedern und die Wörter in einer Wortliste samt (Gesamt)Frequenz ausgeben.

Wäre für ein paar Tips, wie ich das lösen könnte, sehr dankbar!

Schönes WE und danke für Eure Mühe,
frieder
  Mit Zitat antworten Zitat