一个约有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。非常感谢!

解决方案 »

  1.   

    不要用可视控件,改用TStringList,先用Sort先排序。查找用Find函数。
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      SText :TStringList;
      i :integer;
    begin
      SText := TStringList.Create;
      try
        SText.LoadFromFile('C:\Test.txt');
        SText.Sort;
        if SText.Find('iiiii',i) then
          ShowMessage('"iiiii" 找到!')
        else
          ShowMessage('"iiiii"没找到!');
      finally
        Stext.Free;
      end;
    end;
      

  3.   

    这里只是示范一下代码,在实际实用时,可以用一个全局的变量(TStringList类)先装入文件,然后再排序。查找代码放到另一个按钮事件中,查找就会很快。
      

  4.   

    这里只是示范一下代码,在实际实用时,可以用一个全局的变量(TStringList类)先装入文件,然后再排序。查找代码放到另一个按钮事件中,查找就会很快。刚测试了一下,加载倒是非常快, 但是搜索的时间用的更多了。
    、、、、
    上面那句话没明白,然后再排序是什么意思,能不能帮忙写个完整的代码啊,谢谢!
      

  5.   


    // 窗体有一个listbox,两个按钮,一个edit
    var
      li: TStringList;// 添加项目按钮
    procedure TForm1.btn1Click(Sender: TObject);
    var
      i: Integer;
    begin
      Randomize;
      li := THashedStringList.Create;
      // 插入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
        GetTimeDiff(timeStart, timeEnd);
        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 := THashedStringList.Create;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      li.Free;
    end;
      

  6.   

    上面 THashedStringList 换成 TStringList,忘了改了
    unit Unit1;interfaceuses
      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.
      

  7.   

    unit Unit1;interfaceuses
      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.