关于文本文件的读取与统计有一个文本文件,6万行左右,格式统一:  10- 0- 0- 0    test
  10- 0- 0- 1    ok
......
 150- 3-15- 6    test
......
2250- 3-15-16    ok
......如何实现统计10、20……2250开头的test和ok分别有多少?谢谢!分不够再加!

解决方案 »

  1.   

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

  2.   

    先把文件用TstringList.LoadFromFile 载入 TstringList中     StringList.LoadFromFile(TxtFileName );
         TestCount :=0;
         OkCount := 0;
         for index:=0 To StringList.count-1 DO
         BEGIN
              tmpstr := StringList.Strings[index];
              len :=  length( tmpstr );
              numindex:=1;
              while( tmpstr[numindex]<>'-') and (numindex<=len) DO
                    numindex := numindex + 1;
              if (numindex>1) and (numindex<=len) THEN
              begin
                   numstr := copy( tmpstr,1, numindex-1);
                   equal := false;
                   for index:=1 to 225 DO
                   BEGIN 
                       if StrToInt(numstr)=10*index THEN
                       BEGIN
                               //统计'test'的个数
                               if copy( tmpstr, len-4, 4 )='test' THEN
                                       testCount := TestCount + 1;
                               //统计 'OK'的个数
                              IF copy ( tmpstr, len-2,2) then
                                       OkCount := OKCount + 1;    
                                                   
                             break;
                       END;       
                   END;
                   
              end;        
               
         END;
      

  3.   

    条数太多了,可以考虑用THashedStringList来处理,操作和TStringList类似。它定义在IniFiles单元。————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  4.   

    你的文本文件格式是统一的,可以考虑当作文本数据库来做:
    替换一下,把你的文件格式改成这样,加上标题行:
    id1,id2,id3,id4,id5
    10,0,0,0,test
    10,0,0,1,ok
    150,3,15,6,test
    2250,3,15,16,ok
    然后用ADOCONNECTION控件连上该文本文件,在表单上放一ADOquery1,设置连接为前面连接
    然后用ADOquery1直接写查询语句,可得到结果,
    下面为测试代码(当按下按钮BUTTON1时将,对数据进行查询并将结果写入LISTBOX1里):
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s:string;
    begin
      with adoquery1 do
      begin
        close;
        sql.Clear;
        sql.add('select id1,id5,count(*) as ab from a#txt group by id1,id5');
       // parameters[0].Value:='test';
        open;
        while not eof do
        begin
          s:=fieldbyname('id1').AsString;
          s:=s+','+fieldbyname('id5').AsString;
          s:=s+ ','+fieldbyname('ab').AsString;
          listbox1.Items.Add(s);
          next;
        end;
      end;
    end;呵呵,这样是不是快多了啊
      

  5.   

    你的文本文件格式是统一的,可以考虑当作文本数据库来做:
    替换一下,把你的文件格式改成这样,加上标题行:
    id1,id2,id3,id4,id5
    10,0,0,0,test
    10,0,0,1,ok
    150,3,15,6,test
    2250,3,15,16,ok
    然后用ADOCONNECTION控件连上该文本文件,在表单上放一ADOquery1,设置连接为前面连接
    然后用ADOquery1直接写查询语句,可得到结果,
    下面为测试代码(当按下按钮BUTTON1时将,对数据进行查询并将结果写入LISTBOX1里):
    procedure TForm1.Button1Click(Sender: TObject);
    var
      s:string;
    begin
      with adoquery1 do
      begin
        close;
        sql.Clear;
        sql.add('select id1,id5,count(*) as ab from a#txt group by id1,id5');
       // parameters[0].Value:='test';
        open;
        while not eof do
        begin
          s:=fieldbyname('id1').AsString;
          s:=s+','+fieldbyname('id5').AsString;
          s:=s+ ','+fieldbyname('ab').AsString;
          listbox1.Items.Add(s);
          next;
        end;
      end;
    end;呵呵,这样是不是快多了啊
      

  6.   

    推荐用odbc建一个基于这个文本文件的数据源,用楼上的sql语句实现。
      

  7.   

    用什么ODBC,就ADOCONNECTION直接搞定!
      

  8.   

    To wdsimon(老王):怎样替换成你所说的格式呢?!另外,在这些文本文件当中,掺杂着一些不规律的信息,当然了,这些信息是没用的。另,是否有更简单的方法?!谢谢:)
      

  9.   

    直接用替换即可完成,比如对如下数据:
    10- 0- 0- 0    test
    10- 0- 0- 1    ok
    150- 3-15- 6    test
    2250- 3-15-16    ok
    先把-加上两个或三过空格替换成‘,’,然后再-加一个空格把前面的都替换完后,再替换
    后面文本前的空格。你的文本文件有不不规律的信息?不是统一格式的吗?当然,还有更简单的办法来处理,只要你的文件不超过65536行,且格式统一,
    可不作任何处理,直接用EXCEL来打开,然后用数据透视表来汇总你需要的数据,
    这样可不写任何代码。
      

  10.   

    还有没有?准备结账了!哦,关于用ado连接txt文件,用起来不太方便,还是直接读取txt文件处理直观一些。主要是txt文件是交换机吐出来的报告,人工处理太麻烦了!