读书人

如何在一个大量数据中快飞的查询一个字

发布时间: 2013-06-25 23:45:41 作者: rapoo

怎么在一个大量数据中快飞的查询一个字符串?
一个约有6M大小的txt文本
里面的数据格式是每行一个
比如

qqqqq
wwwww
eeeee
rrrrr
ttttt
yyyyy
uuuuu
iiiii
ooooo
ppppp
...
N行

需要比较某一行是否满足条件,比如查询 iiiii
我的做法是用ListBox加截这个txt
然后
var
i: integer;
b: bool;
begin
for i:=0 to ListBox1.Items.Count -1 do
begin
if ListBox1.Items[i] = 'iiiii' then
begin
b:= true;
break;
end;
end;
if b then
ShowMessage('找到了') else ShowMessage('没找到');
end;

但是太慢了,大约用了500ms.
求大神帮忙一下,能控制在100ms内最好了。
最好方式简单一点,不用在电脑上安装什么东西,比如SQL。非常感谢!
[解决办法]
上面 THashedStringList 换成 TStringList,忘了改了



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
lst1: TListBox;
edt1: TEdit;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure lst1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// 窗体有一个listbox,两个按钮,一个edit
var
li: TStringList;

// 添加项目按钮

procedure TForm1.btn1Click(Sender: TObject);
var
i: Integer;
begin
Randomize;
// 插入40W项随机的10位的数字
for i := 0 to 39999 do
begin
li.Add(IntToStr(Random(9999999999)));
end;
li.Sort; // 排序
lst1.Items.AddStrings(li); // 也装进listbox显示
end;

// 查询按钮

procedure TForm1.btn2Click(Sender: TObject);
var
index: Integer;
begin
if li.Find(edt1.Text, index) then
begin
ShowMessage('找到了,在第 ' + IntToStr(index) + ' 项');
end
else
ShowMessage('没找到');
end;

// 在listbox中选中一项来进行查询,方便测试



procedure TForm1.lst1Click(Sender: TObject);
begin
edt1.Text := lst1.Items[lst1.ItemIndex];
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
li := TStringList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
li.Free;
end;

end.


[解决办法]
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btnLoad: TButton;
btnFind: TButton;
procedure btnLoadClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnFindClick(Sender: TObject);
private
{ Private declarations }
SText :TStringList;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnLoadClick(Sender: TObject);
begin
if SText=nil then
SText := TStringList.Create
else
SText.Clear;
SText.LoadFromFile('C:\Test.txt');
SText.Sorted := True;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SText.Free;
SText := nil;
end;

procedure TForm1.btnFindClick(Sender: TObject);
var
i :integer;
begin
if SText.Find('iiiii',i) then
ShowMessage('"iiiii" 找到!')
else
ShowMessage('"iiiii"没找到!');
end;

end.

读书人网 >.NET

热点推荐