Registriert seit: 28. Feb 2009
78 Beiträge
|
Einträge in Listview / Stringlist vergleichen;Strings zählen
28. Feb 2009, 04: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
|