文本内容  10- 0- 0- 0    SLMACOS  FREE  ...
  10- 0- 0- 1    SLMACOS  SUB   ...
  10- 0- 0- 1    SLMACOS  SUB   ...
...
  10- 3- 0- 2    SLCD     FREE  ...
  10- 3- 0- 3    SLCD     ISUB  ...
...
 150- 0- 5- 6    SLMAFPE  FREE  ...
 150- 0- 5- 7    SLMAFPE  SUB   ...
...文本内容如上,主要是统计10、20...150...开头的SUB、FREE、ISUB分别有多少,开头为10、20...150...最多到2550。
比如,我要统计10里面,SLMACOS共有多少、SLCD有多少、SUB有多少、FREE、ISUB分别有多少。然后统计20、30、40、50...150,最多到2550。不知道有什么比较好的方法提高效率。能贴出代码更好!谢谢!

解决方案 »

  1.   

    1.use readln(f,s)  一行一行读,再解析
    2.不过2550行,use TstringList 一次读入, 再解析
      

  2.   

    Var
      FList: TStringList;
      tmpStr: String;
    Begin
      FList:= TStringList.Create;
      FList.LoadFromFile(TextFileName);
      for i:=0 to  FList.Count-1 do
     begin
    if copy(flist[i],1,2)='10' then 累加,具体位置你自己判断一下
    end;
      

  3.   

    先读出来 再在stringlist里统计:
    var
      FileName : TextFile;
      Str,Tmp : String;
      TStrList : TStringList;
      i,k : Integer;
    begin
      TStrList := TStringList.Create;
      TStrList.Clear;
      if not (FileExists(GetNameDir(Application.ExeName)+'xuanhao.txt')) then
      begin
        Application.MessageBox('xuanhao.txt文件不存在,请先转出TXT文件','提示',MB_OK+MB_ICONSTOP);
        Exit;
      end;
      AssignFile(FileName,GetNameDir(Application.ExeName) + 'xuanhao.txt');
      Reset(FileName);
      Readln(FileName,Str);
      CloseFile(FileName);
      if Str <> '' then
      begin
        i := pos(',',str);
        while i > 0 do
        begin
          Tmp := copy(Str,1,i - 1);
          TStrList.Add(Tmp);
          Str := copy(Str,i + 1,length(Str)-i);
          i := pos(',',Str);
        end;
        if Str <> '' then
        begin
          TStrList.Add(Str);
        end;
      end;
    end;
      

  4.   

    Var
      FList: TStringList;
      TextFileName: String;
      Count, i: Integer;
    Begin
      Count:= 0;
      if OpenDialog1.Execute then
        TextFileName:= OpenDialog1.FileName;  FList:= TStringList.Create;
      FList.LoadFromFile(TextFileName);  for i:=0 to  FList.Count-1 do
        begin
    //如果有规律的话可以通过找空格的位置或者其他方法来截取要查找的关键字
          if (pos('10', Flist[i])<>0) and (pos('SUB', Flist[i])<>0) then Inc(Count);
        end;  showmessage(IntToStr(Count));
      Flist.Free;
    end;
      

  5.   

    用排序二叉树的方法统计,那样快的多节点键值包含所有可能出现的SUB什么的,有一个就+1最后中序遍历一下结果就出来了,快