Написал прогу для анализа текста на частотность слов. это очень полезная вещь, для изучения иностранных языков.
В программе два окна- Мемо и Листбокс. В мемо виден текст, а в Листбоксе выводятся слова и колличество повторений в тексте.
Текст должен быть в кодировке UTF-8 если текст использует национальные шрифты. Для английского текста можно в обычной кодировке.
В Листбоксе обязательно установить поле sorted в true !!!!!!!!!!!!!!!!!!!
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; Label2: TLabel; ListBox1: TListBox; Memo1: TMemo; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; MyStr: TStringList; st1: String; implementation {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin MyStr:=TStringList.Create; // создаём объект TStringList if OpenDialog1.Execute then // загружаем файл в кодировке UTF-8 MyStr.LoadFromFile(OpenDialog1.FileName); st1:= MyStr.Text;//помещаем в строковую переменную Memo1.Lines.Text:= st1; //Помещаем текст в мемо ( для визуального наблюдения) st1:=StringReplace(st1,'.',' ',[rfReplaceAll]); // заменяем разделители на пробелы st1:=StringReplace(st1,',',' ',[rfReplaceAll]); st1:=StringReplace(st1,'!',' ',[rfReplaceAll]); st1:=StringReplace(st1,'?',' ',[rfReplaceAll]); st1:=StringReplace(st1,'(',' ',[rfReplaceAll]); st1:=StringReplace(st1,')',' ',[rfReplaceAll]); st1:=StringReplace(st1,'[',' ',[rfReplaceAll]); st1:=StringReplace(st1,']',' ',[rfReplaceAll]); st1:=StringReplace(st1,'{',' ',[rfReplaceAll]); st1:=StringReplace(st1,'}',' ',[rfReplaceAll]); st1:=StringReplace(st1,'-',' ',[rfReplaceAll]); st1:=StringReplace(st1,'_',' ',[rfReplaceAll]); //убираем лишние пробелы внутри текста while(pos(' ',st1)<>0) do st1:=StringReplace(st1,' ',' ',[rfreplaceall]); //загружаем в листбокс ListBox1.Items.Text:= stringReplace(st1, ' ', #13#10, [rfReplaceAll]);; for i := Listbox1.Items.Count - 1 downto 0 do // удаляем в листбоксе пустые строки if Listbox1.Items[i]='' then Listbox1.Items.Delete(i); end; procedure TForm1.Button2Click(Sender: TObject); var i, con1: Integer; begin con1:= 1; // счётчик вхождения слова for i := Listbox1.Items.Count-1 downto 1 do begin if Listbox1.Items[i-1]= Listbox1.Items[i] then begin con1:=con1+1; Listbox1.Items.Delete(i); end else begin Listbox1.Items[i]:= (Listbox1.Items[i]+ '=' +IntToStr(con1)); con1:= 1; end; end; //так как цикл на одну итерацию меньше, то последнее //поле заполняется после выхода из цикла. Listbox1.Items[0]:= (Listbox1.Items[0]+ '=' +IntToStr(con1)); end; procedure TForm1.FormCreate(Sender: TObject); begin Memo1.Lines.Text:=''; end; end.