首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

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

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

怎么在一个大量数据中快飞的查询一个字符串?
一个约有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.

热点排行