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