AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wörter zählen, optmimieren?

Ein Thema von Baumel · begonnen am 20. Aug 2003 · letzter Beitrag vom 20. Okt 2004
Antwort Antwort
Seite 1 von 2  1 2      
Baumel

Registriert seit: 10. Aug 2003
Ort: Wassenberg
15 Beiträge
 
Delphi 6 Enterprise
 
#1

Wörter zählen, optmimieren?

  Alt 20. Aug 2003, 23:10
Hallo,
ich möchte die Wörter in einem Rtf-Feld zählen. Dazu habe ich folgenden Code verwendet (s.auch http://www.delphipraxis.net/internal...6rter+z%E4hlen).

Es funktioniert ja eigentlich auch, aber nur unheimlich langsam. Auch die schnellere Variante, die nur auf Leerzeichen prüft, ist bei Texten größer als 100KByte zu langsam (ab 300KByte Text wirds richtig lahm). In Word oder Works gibt es auch so eine Funktion, nur dort ist diese blitzschnell.
Hat jemand Optimierungsvorschläge oder andere meth. Ansätze?
Delphi-Quellcode:
function TEditor.CountWordsSlow(minwordlength:Integer):Integer;
var s: string;
    c: char;
    i, l, le:Integer;
begin
  i:=0;
  le:=Length(Text);
  s:='';
  if le > 0 then
  for l:=1 to le do
  begin
    c:=Text[l];
    if (Upcase(c) in ['A'..'Z','Ä','Ö','Ü','ü','ö','ä','ß']) then s:=s+c
    else
    begin
      if (Length(s) >= minwordlength) Then Inc(i);
      s:='';
    end;
  end;
  CountWordsSlow:=i;
end; {TEditor.CountWords}


function TEditor.CountWordsFast(minwordlength:Integer):Integer;
var s: string;
    c: char;
    pnow, plast,i,l,le:Integer;
begin
  //erste Variante
  (*
  i:=0;
  le:=Length(Text);
  pnow:=1;
  plast:=1;
  if le > 0 then
  for l:=1 to le do
  begin
    if Text[l]=' ' then
    begin
      plast:=pnow;
      pnow:=l;
      if (pnow-plast) > minwordlength then inc(i);
    end;
  end; {for}
  *)

  // zweite Variante
  s:=Text;
  i:=0;
  pnow:=1;
  if Length(s) > 0 then
  while pnow > 0 do
  begin
    pnow:=Pos(' ',s);
    if pnow >= minwordlength then inc(i);
    Delete(s, 1,pnow);
  end;
  //Rest
  CountWordsFast:=i;
end; {TEditor.CountWordsFast}
[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]
  Mit Zitat antworten Zitat
Benutzerbild von Aya
Aya

Registriert seit: 24. Jul 2003
Ort: Kassel
138 Beiträge
 
Delphi 6 Professional
 
#2

Re: Wörter zählen, optmimieren?

  Alt 20. Aug 2003, 23:18
Hi,

ich hab gradmal was versucht...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  cnt, i: Integer;
begin
  cnt:=0;
  for i:=1 to Length(RichEdit1.Text) do
    if RichEdit1.Text[i] = ' then
      Inc(cnt);
  ShowMessage(IntToStr(cnt));
end;
Das ist wahnsinnig langsam... aber diese version:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
  cnt, i: Integer;
begin
  cnt:=0;
  S:=RichEdit1.Text;
  for i:=1 to Length(S) do
    if S[i] = ' then
      Inc(cnt);
  ShowMessage(IntToStr(cnt));
end;
ist rasend schnell... bei nem 1mb Text dauert es keine 10tel Sekunde (Also klick auf Button und sofort isses ausgezählt!)

Hoffe das hilft dir ein wenig

Au'revoir,
Aya~
I aim for my endless dreams and I know they will come true!
S: String = #86^)^3^)^4#58#32^(^4^4^0#58#47#47^7^7^7#46^+^/^3^(^)^'^!^9^!#46^$^%;
  Mit Zitat antworten Zitat
Baumel

Registriert seit: 10. Aug 2003
Ort: Wassenberg
15 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Wörter zählen, optmimieren?

  Alt 20. Aug 2003, 23:42
Zitat:
S:=RichEdit1.Text;

Hoffe das hilft dir ein wenig
Hmmm, jau. Jetzt gehts ab. Die minimalen Änderungen bei der function CountWordsSlow bringen es. Schwupps das Ergebnis ist sofort da - ohne den Änderungen konnte ich mitunter ca. 15 Minuten Däumchendrehen.


Danke.
  Mit Zitat antworten Zitat
JoelH
(Gast)

n/a Beiträge
 
#4

hmm,

  Alt 21. Aug 2003, 05:15
das ist aber arg ungenau ? Wörter könne doch auch durch Kommas etc. getrennt sein oder ?
Ich würd es umgekehrt machen in der abfrage
anstatt  if s[i] = ' then .. if not(s[i] in ['a'..'z','A'..'Z']) then ..
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Wörter zählen, optmimieren?

  Alt 21. Aug 2003, 16:42
Das ist aber auch blöd. Was, wenn man ein Dollarzeichen schreibt

Als Trennzeichen dienen i.d.R. Zeilenumbrüche, Leerzeichen, Kommas, Strichpunkte und Tabs
Somit würde das dann etwa so aussehen:

if s[i] in [#9,#10,#13,#32,',','.',';'] then //...
Aufpassen muss man aber bei Trennstrichen vor Zeilenumbrüchen, denn das sind dann meist Silbentrennungszeichen. Befindet sich direkt vor einem Zeilenumbruch ein Minus-Strich(-), trennt der Zeilenumbruch das Wwort nicht.
Die Bedingung also folgendermaßen erweitern:
Delphi-Quellcode:
if s[i] in [#9,#10,#13,#32,',','.',';']) then
  if (s[i] = #13) and (s[i-1] <> '-') then //jetzt ein Wort
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
JoelH
(Gast)

n/a Beiträge
 
#6

hmm,

  Alt 21. Aug 2003, 16:47
ist allgemein schwierig weil es ist wie mit der deutschen Sprache, es gibt x Ausnahmen und Spezialfälle.
Also ich hab ein wenig Syntaxhighlighting versucht zu machen, gibt auch ein Posting dazu irgendwo hier, wie auch immer. Das parsen ist gar nicht so einfach. Schade dass Delphi keine reg. Expressions von Haus aus unterstützt, das ist einfach eine feine Sache (php,ruby,perl loben muss).
  Mit Zitat antworten Zitat
Baumel

Registriert seit: 10. Aug 2003
Ort: Wassenberg
15 Beiträge
 
Delphi 6 Enterprise
 
#7

Re: Wörter zählen, optmimieren?

  Alt 21. Aug 2003, 16:53
Hi,

Zitat:
das ist aber arg ungenau ? Wörter könne doch auch durch Kommas etc. getrennt sein oder ? ...
ich nutze jetzt auch function CountWordsSlow mit der Modifikation, das nicht mehr direkt auf die RTF.Text zugegriffen wird. Der Inhalt wird nun in einen String s kopiert und damit wird dann gearbeitet. Seitdem habe ich keine Performance-Probleme mehr.

Ich dachte anfangs die Performanceeinbußen kamen durch die Mengenoperationen In [...].
Deshalb hatte ich einen anderen, schnelleren (und wie du zurecht bemerkst) äußerst ungenauen Ansatz gewählt (CountWordsFast). Wirklich schneller lief der auch nicht.


Gruß
Dirk
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Wörter zählen, optmimieren?

  Alt 21. Aug 2003, 16:57
Moin Dirk,

bei jeder Art Stringliste, eben auch RichEdit.Lines, wird die Eigenschaft Text bei jedem Lesezugriff auf diese Eigenschaft aus den gesamten Strings zusammengesetzt, und bei jedem Schreibzugriff werden die Zeilen anschliessend neu aufgebaut.
Das ist das, was so auf die Performance drückt.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von bjacke
bjacke

Registriert seit: 1. Aug 2004
Ort: Berlin
82 Beiträge
 
Delphi 7 Personal
 
#9

Re: Wörter zählen, optmimieren?

  Alt 19. Okt 2004, 14:55
[quote="Aya"]Hi,

ich hab gradmal was versucht...
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  cnt, i: Integer;
begin
  cnt:=0;
  for i:=1 to Length(RichEdit1.Text) do
    if RichEdit1.Text[i] = ' then
      Inc(cnt);
  ShowMessage(IntToStr(cnt));
end;
Das ist wahnsinnig langsam... aber diese version:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  S: String;
  cnt, i: Integer;
begin
  cnt:=0;
  S:=RichEdit1.Text;
  for i:=1 to Length(S) do
    if S[i] = ' then
      Inc(cnt);
  ShowMessage(IntToStr(cnt));
end;
Hier habe ich aber das Problem, dass auch Leerzeichen mitgezählt werden. Ich habe den Quelltext vollgender Maßen ergänzt:
Var i,count:integer; text:string;
Delphi-Quellcode:
count:=0;
Text:=Rich.Text ;
for i:=1 to length(Text) do
if Text[i]=' then if (Text[i+1]<>' ') then inc(count);
MfG bjacke

Das Ganze ist mehr als die Summe seiner Computerteile.
  Mit Zitat antworten Zitat
LarsMiddendorf

Registriert seit: 4. Sep 2003
Ort: Hemer
104 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Wörter zählen, optmimieren?

  Alt 19. Okt 2004, 16:15
Da mußt du aber wegen dem i+1 und der Länge des Strings aufpassen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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