1 unit Main; 2 3 {$mode objfpc}{$H+} 4 5 interface 6 7 uses 8 Classes, SysUtils, Math, Forms, Controls, Dialogs, StdCtrls, Spin, 9 LookupStringList; 10 11 type 12 13 { TForm1 } 14 15 TForm1 = class(TForm) 16 btnDedupeMemo: TButton; 17 btnDedupeFile: TButton; 18 btnGenerate: TButton; 19 Label1 :TLabel; 20 lblLines: TLabel; 21 lblTime: TLabel; 22 Memo: TMemo; 23 SpinEdit1: TSpinEdit; 24 procedure btnDedupeFileClick(Sender: TObject); 25 procedure btnGenerateClick(Sender: TObject); 26 procedure btnDedupeMemoClick(Sender: TObject); 27 procedure FormCreate(Sender: TObject); 28 procedure FormDestroy(Sender: TObject); 29 procedure FormShow(Sender: TObject); 30 private 31 inList :TStringList; 32 procedure UpdateDuplicates(aDuplicateCount: string); 33 procedure UpdateTime(aTime: TDateTime); 34 public 35 36 end; 37 38 var 39 Form1: TForm1; 40 41 implementation 42 43 {$R *.lfm} 44 45 { TForm1 } 46 47 procedure TForm1.UpdateDuplicates(aDuplicateCount: string); 48 begin 49 lblLines.Caption := 'Duplicated Lines: ' + aDuplicateCount; 50 end; 51 52 procedure TForm1.UpdateTime(aTime: TDateTime); 53 begin 54 lblTime.Caption := 'Time: ' + TimeToStr(aTime); 55 end; 56 57 procedure TForm1.btnGenerateClick(Sender: TObject); 58 var 59 i, j: Integer; 60 s :string; 61 begin 62 UpdateDuplicates('?'); 63 UpdateTime(0); 64 Memo.Clear; 65 Application.ProcessMessages; 66 Screen.Cursor := crHourGlass; 67 try 68 InList.Clear; 69 for i := 0 to SpinEdit1.Value - 1 do 70 begin 71 s := ''; 72 for j := 0 to 5 do 73 s := s + chr(randomrange(97, 123)); 74 InList.Add(s); 75 end; 76 Memo.Lines.Assign(inList); 77 finally 78 Screen.Cursor := crDefault; 79 end; 80 end; 81 82 procedure TForm1.btnDedupeMemoClick(Sender: TObject); 83 var 84 DSL :TLookupStringList; 85 T :TDateTime; 86 begin 87 Screen.Cursor := crHourGlass; 88 try 89 T := Now; 90 DSL := TLookupStringList.Create; 91 try 92 DSL.Assign(Memo.Lines); 93 UpdateDuplicates(IntToStr(Memo.Lines.Count - DSL.Count)); 94 Memo.Lines.Assign(DSL); 95 finally 96 DSL.Free; 97 end; 98 UpdateTime(Now - T); 99 finally 100 Screen.Cursor := crDefault; 101 end; 102 end; 103 104 procedure TForm1.btnDedupeFileClick(Sender: TObject); 105 var 106 T :TDateTime; 107 N :integer; 108 DSL :TLookupStringList; 109 begin 110 lblTime.Caption := 'Time:'; 111 lblLines.Caption := 'Duplicated lines:'; 112 Application.ProcessMessages; 113 114 if Trim(Memo.Text) = '' then 115 begin 116 ShowMessage('Generating data. Please wait.'); 117 btnGenerateClick(nil); 118 end; 119 120 ShowMessage('Saving memo to a file. Please wait.'); 121 Memo.Lines.SaveToFile('temp.txt'); 122 ShowMessage('Dedupping the file.'); 123 T := Now; 124 N := Memo.Lines.Count; 125 DSL := TLookupStringList.Create; 126 try 127 DSL.LoadFromFile('temp.txt'); 128 lblLines.Caption := 'Duplicated Lines: ' + IntToStr(N - DSL.Count); 129 DSL.SaveToFile('temp.txt'); 130 lblTime.Caption := 'Time: ' + TimeToStr(Now - T); 131 ShowMessage('Deleting the file.'); 132 DeleteFile('temp.txt'); 133 finally 134 DSL.Free; 135 end; 136 end; 137 138 procedure TForm1.FormCreate(Sender: TObject); 139 begin 140 inList := TStringList.Create; 141 Randomize; 142 end; 143 144 procedure TForm1.FormDestroy(Sender: TObject); 145 begin 146 inList.Free; 147 end; 148 149 procedure TForm1.FormShow(Sender: TObject); 150 begin 151 spinedit1.Value := 100000; 152 end; 153 154 end. 155