AGB  ·  Datenschutz  ·  Impressum  







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

Wörter aus Memo extrahieren

Ein Thema von Gecko · begonnen am 7. Jun 2007 · letzter Beitrag vom 12. Jun 2007
Antwort Antwort
Gecko
(Gast)

n/a Beiträge
 
#1

Wörter aus Memo extrahieren

  Alt 7. Jun 2007, 00:19
Hallo,

suche einen Algorithumus, der mir aus einem Memo alle Wörter einzeln herausholt, und das möglichst effizient.

Benutze im Moment diesen hier:

Delphi-Quellcode:
function wort_(s: string; k: integer): string;
var n: integer;
begin
  s := trim(s); //entfernt Leerzeichen, #13 oder andere Steuerzeichen
  n := pos(' ', s);
  if n = 0 then n := pos(#13,s); //Zeilenumbruch
  if n = 0 then Begin
    if k > 1 then result := 'else result := s
  End else Begin //z.B. s='abc def;
    if k > 1 then result := wort_(copy(s, n + 1), k - 1) //rekursiv
    else result := copy(s, 1, n - 1);
  End;
end;
welchen ich per while durchlaufen lasse, bis er nichts mehr aussspuckt.
Allerdings treibt der bei einem gröseren Memo selbst meinen Core 2 Duo in die Knie.

Hoffe ihr könnt mir helfen!
  Mit Zitat antworten Zitat
7. Jun 2007, 07:21
Dieses Thema wurde von "Sharky" von "Klatsch und Tratsch" nach "Sonstige Fragen zu Delphi" verschoben.
Ist ja eine Delphifrage
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Wörter aus Memo extrahieren

  Alt 7. Jun 2007, 07:37
Ruft du wort_ in einer Schleife auf?
Falls ja? Wieso zerlegst du den Text nicht erstmal in ein Stringlist so hast du für einen Text nur einmal die Zerlegung.

Auch mußt du bedenken das Trennzeichen wie :,. keine Wortbestandteile sind und auch Text wie
Zitat:
bla bla bla,bla blba.Bla
also mit fehlenden Leerzeichen nach Trennzeichen erkannt werden müssen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wörter aus Memo extrahieren

  Alt 7. Jun 2007, 07:49
Zitat von Gecko:
... suche einen Algorithumus, der mir aus einem Memo alle Wörter einzeln herausholt, und das möglichst effizient.
...
Hai Gecko,

als erstes würde ich definieren was ein Wort ist Dafür würde ich mir eine Liste mit den Trennzeichen erstellen und dann den Text durchlaufen und dabei die Zeichen zwichen zwei Trennzeichen rauskopieren.

Hier einmal ein Ansatz:
Delphi-Quellcode:
procedure GetWords(const s: string; sl: TStrings);
const
  Delimiters: set of Char = [' ', ',', #10, #13, '!', '?'];
var
  start: Integer;
  ende: Integer;
  ndx: Integer;
  wort: string;
begin
  start := 0;
  ende := 0;
  for ndx := 1 to Length(s) do
  begin
    if s[ndx] in Delimiters then
    begin
      ende := ndx;
    end
    else
    begin
      if (start = 0) then
        start := ndx;
    end;
    if (start > 0) and (ende > 0) then
    begin
      wort := copy(s, start, ende - start);
      sl.Add(wort);
      start := 0;
      ende := 0;
    end;
  end;
end;


procedure TDemo_Form.Button1Click(Sender: TObject);
begin
  GetWords(Memo1.Text, listbox1.Items);
end;
Du musst natürlich noch einige Sonderfälle berücksichtigen. Zum Beispiel zwei Trennzeichen hintereinander usw.

[Edit]Während ich mir die Flossen wund tippe schreibt Bernhard das in zwei Sätzen
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#5

Re: Wörter aus Memo extrahieren

  Alt 7. Jun 2007, 08:04
Noch ne Version ?

Delphi-Quellcode:
Function WordCount(CText: String): Longint;
Var
  Ix: Word;
  Work_Count: Longint;
  anyWord: String;

  // Definiert was Wörter von einander trennt
  Function Seps(As_Arg: Char): Boolean;
  Begin
    Seps := As_Arg In
      [#0..#47, '?', ':', ';', '=', '#', '\', '[', ']', '{', '}', '^'];
  End;

Begin
  Work_Count := 0;
  Ix := 1;
  While Ix <= Length(CText) Do
  Begin
    anyWord := '';

    // den Begin eines Wortes suchen
    While (Ix <= Length(CText)) And (Seps(CText[Ix])) Do
      Inc(Ix);

    If Ix <= Length(CText) Then
    Begin
      // das Ende eines Wortes suchen
      While (Ix <= Length(CText)) And (Not Seps(CText[Ix])) Do
      begin
        Inc(Ix);
        anyWord := anyWord + Form1.Memo1.Text[ix-1];
      end;

     Inc(Work_Count);

     Form1.ListBox1.Items.Add(anyWord);

     // Windows nachrichten zw. Windows und eigener App. verarbeiten lassen
     Application.ProcessMessages;
    End;
  End;
  Result := Work_Count;
End;
Abgelitten von Wörter in einem String zählen
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Wörter aus Memo extrahieren

  Alt 7. Jun 2007, 08:30
Hallo,

die Funktion SysUtils.WrapText() ist manchmal auch ganz hilfreich - einfach MaxCol auf 1 setzen.

Grüße vom marabu
  Mit Zitat antworten Zitat
Gecko
(Gast)

n/a Beiträge
 
#7

Re: Wörter aus Memo extrahieren

  Alt 12. Jun 2007, 11:34
. (falscher post)
  Mit Zitat antworten Zitat
chaoslion

Registriert seit: 1. Mär 2006
52 Beiträge
 
#8

Re: Wörter aus Memo extrahieren

  Alt 12. Jun 2007, 11:46
Hey,
hier wäre noch ne Möglichkeit:
Delphi-Quellcode:
procedure parseWords( const str: string; var tokens: TStringList );
var
  i: integer;
  buf: string;
  j: integer;
begin
  i := 1;
  
  while( i <= length(str) )do
  begin

    if( (ord(str[i]) <= 32) )then
    begin
      inc(i);
      continue;
    end
    else if( str[i] in ['A'..'z'] )then
    begin
      j := i;
      while( (i<= length(str)) and ((str[i] in ['A'..'z']) or (str[i] in ['0'..'9']) or (str[i] = '_') ) )do
        inc(i);
      buf := copy(str,j,i-j);
      tokens.Add(buf);
    end
    else
     inc(i);
  end;

end;
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:07 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