![]() |
AW: Wörter zählen
Liste der Anhänge anzeigen (Anzahl: 1)
Das Beispiel TOKENCOUNT (648 Wörter) von awk und das Beispiel von hier
![]() (680 Wörter) sind unterschiedlich zu MS WORD (660 Wörter). Textprobe im Anhang.
Delphi-Quellcode:
unit Unit1;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtDlgs, Vcl.StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; OpenTextFileDialog1: TOpenTextFileDialog; Button2: TButton; Label1: TLabel; Button3: TButton; SaveTextFileDialog1: TSaveTextFileDialog; Button4: TButton; Label2: TLabel; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormShow(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function Seps(As_Arg: ANSIChar): Boolean; begin Seps := As_Arg in [#0..#$1F, ' ', '.', ',', '?', ':', ';', '(', ')', '/', '\', '-']; end; function WordCount(CText: ANSIstring): Longint; var Ix: Word; Work_Count: Longint; begin Work_Count := 0; Ix := 1; while Ix <= Length(CText) do begin while (Ix <= Length(CText)) and (Seps(CText[Ix])) do Inc(Ix); if Ix <= Length(CText) then begin Inc(Work_Count); while (Ix <= Length(CText)) and (not Seps(CText[Ix])) do Inc(Ix); end; end; WordCount := Work_Count; end; //------------------------------------------------------------------------------ function TokenCount(const cText: String): integer; var s: string; nPos: integer; begin result:=0; s:=trimright(cText); nPos:=Pos(#32,s); if (nPos=0) and (length(s)>0) then inc(result); while nPos>0 do begin inc(Result); System.Delete(s,1,nPos); s:=trimleft(trimright(s)); nPos:=Pos(#32,s); end; end; //------------------------------------------------------------------------------ procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Clear; if OpenTextFileDialog1.execute then Memo1.Lines.loadfromfile(OpenTextFileDialog1.FileName); end; procedure TForm1.Button2Click(Sender: TObject); begin Label1.Caption:= INTTOSTR(WORDCOUNT(Memo1.Text)); end; procedure TForm1.Button3Click(Sender: TObject); begin if SaveTextFileDialog1.execute then Memo1.Lines.SaveTofile(SaveTextFileDialog1.FileName); end; procedure TForm1.Button4Click(Sender: TObject); begin Label2.Caption:= INTTOSTR(TOKENCOUNT(Memo1.Text)); end; procedure TForm1.FormShow(Sender: TObject); begin Label1.Caption:= INTTOSTR(WORDCOUNT(Memo1.Text)); end; end. |
AW: Wörter zählen
Mit dieser Routine komme ich bei oben angehängtem Text auf 612 Wörter.
Delphi-Quellcode:
Text aufbröseln und "von Hand" nachzählen ergab ebenfalls 612 Wörter.
function WortCount(s : String): Integer;
var i : Integer; bInWort : Boolean; begin Result := 0; bInWort := False; for i := 1 to Length(s) do begin case s[i] of // Wenn Ziffern auch als Zeichen für Wörter gelten sollen, // oder Zahlen als Wort zu zählen sind: // '0'..'9', // Wer weitere Zeichen berücksichtigen will, darf hier gerne erweitern: 'A'..'Z', 'Á','É','Í','Ó','Ú', 'À','È','Ì','Ò','Ù', 'Ä','Ö','Ü', 'a'..'z', 'á','é','í','ó','ú', 'à','è','ì','ò','ù', 'ä','ö','ü','ß' : if not bInWort then begin Result := Result + 1; bInWort := True; end; else bInWort := False; end; end; end; var sl : TStringList; begin sl := TStringList.Create; sl.LoadFromFile('c:\temp\Von 14 auf 20 Millionen.txt'); ShowMessage(IntToStr(WortCount(sl.Text))); sl.Free; end; Frage: ist das ein Wort? Welt-Krebs-Bericht Oder sind das drei Wörter? Wird mit obiger Routine als drei gezählt. Word zählt auch die Zahlen oder ein Datum ... als einzelne Wörter. Wenn man's genau haben will, muss man erstmal definieren, was genau ist ;-) Und dann wird es schnell beliebig komplex. |
AW: Wörter zählen
|
AW: Wörter zählen
Zitat:
Weltkrebsbericht oder WeltKrebsBericht. Dieses nennt man ![]() Ich liebe Binnenmajuskel! Grund: Solch ein Wort lässt sich leichter lesen. Micropachycephalosaurus hongtuyanensis, ein Dinosaurier MicroPachyCephaloSaurus HongtuYanensis, ein Dinosaurier Der Gattungsname – einer der längsten aller Dinosaurier – leitet sich von den Wörtern mikros (=„klein“), pachys (=„dick“), kephale (=„Kopf“) und sauros (=„Echse“) ab und bedeutet dementsprechend „kleine Dickkopfechse“. Hongtu = Ort, wo es rote Erde gibt, (Red soil = roter Ackerboden) Yunnan = Provinzname. Fundort: Wangshi, Shandong (China), ca. 80 Mill. Jahre alt. |
AW: Wörter zählen
Dankesehr für die Aufklärung.
Ich bin da auch ein großer Fan von. Jetzt weiss ich auch endlich wie ![]() Rollo |
AW: Wörter zählen
Bei mir zählt er leider immer nur zwei Wörter, egal wie viele es sind und finde dabei den Fehler auch nicht
procedure TForm1.Button2Click(Sender: TObject); var i, woerter : integer; text : string; begin woerter:= 1; for i := 0 to length (text) do begin inc(woerter); continue; end; Edit3.Text:= inttostr(woerter); end; |
AW: Wörter zählen
Wie oben bereits beschrieben ist deine Variable Text leer.
Du setzt den Startwert auf 1, zählst in deiner Schleife sofort 1 hoch: Ergebnis ist 2. Wie ebenfalls bereits oben beschrieben zählst du nicht die Wörter sondern die Anzahl Zeichen. Also solltest du in deiner Schleife nur dann hochzählen, wenn ein Leerzeichen ausgewertet wird. Continue ist hier überflüssig! Sorge mit Trim noch dafür das weder am Anfang noch am Ende deines Strings Leerzeichen stehen (Trailing-Spaces). Dann kannst du die naheliegende Variante verwenden, indem du jedes Zeichen Text[i] auf Space / Leerzeichen auswertest. Diese "naive" Variante kannst du dann wie oben bereits angezeigt, verfeinern und um die Zeichen erweitern, die ebenfalls zur Trennung von Worten führen. Beispielroutine ist ungetestet.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var i, woerter : integer; text : string; begin woerter:= 0; text := Trim('Dies ist ein kurzer Text') // Trailing-Spaces entfernen; for i := 1 to length (text) do begin if text[i] = ' ' then inc(woerter); // continue; // überflüssig! end; // das letzte Wort mitnehmen inc(woerter); Edit3.Text:= inttostr(woerter); end; |
AW: Wörter zählen
verstanden habe ich, was mein Fehler war, nur leider funktioniert es immer noch nicht, entweder er gibt mir 0 oder 1 aus.
|
AW: Wörter zählen
Hast Du Dir eigentlich auch nur einen der Lösungsvorschläge angesehen?
Sherlock |
AW: Wörter zählen
Ich habe mir alle angesehen, nur leider verstehe ich die wenigsten und möchte gerne die Lösungen nutzen, die ich auch nachvollziehen kann. Vieles haben wir nämlich in der Schule nicht gelernt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz