DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: randy522732557
今日帖子: 25
在线用户: 16
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 xiaoshou (xiaoshou) ★☆☆☆☆ -
盒子活跃会员
2005/2/21 14:37:25
标题:
请教08568|2^13389|6^...如何统计个数 浏览:1924
加入我的收藏
楼主: 08568|2^13389|6^
08568|1^12268|4^|08568|^6
..........
..........(注08568|2表示的一共有2个08568)
我想分别统计一下08568,13389,12268....等只要个数!
如果是一条一条了if 08568 in first_record 就inc(1) next的话太慢了!
----------------------------------------------
-
作者:
男 ptgfr (ptgfr) ★☆☆☆☆ -
盒子活跃会员
2005/2/21 16:15:57
1楼: 看不太懂你写的意思呢
你是用' ^ ' 这符号做区隔吗
----------------------------------------------
to be ,not to be, is life!
until now, I still study life....
作者:
男 ptgfr (ptgfr) ★☆☆☆☆ -
盒子活跃会员
2005/2/21 17:08:06
2楼: procedure TForm1.Button1Click(Sender: TObject);
 var temp:string;
     i,p,p1,p2,p3:integer;
begin
   memo1.Text:='08568|2^13389|6^'+ #13#10+
'08568|1^12268|4^08568|6'+#13#10+
'08568|4^13389|6^08568|1^13389|6^08568|3^13389|6^';

   p1:=0;
   p2:=0;
   p3:=0;
   p:=0;
   for i :=0  to memo1.Lines.Count-1  do
   begin
     temp:='';
     temp:= memo1.Lines.Strings[i];
      while pos('08568|',temp)> 0 do
       begin
        p1:=p1+strtoint(copy(temp,pos('08568|',temp)+6,1));
        delete(temp,pos('08568|',temp),9);
       end;

     temp:='';
     temp:= memo1.Lines.Strings[i];
      while pos('13389|',temp)> 0 do
       begin
        p2:=p2+strtoint(copy(temp,pos('13389|',temp)+6,1));
        delete(temp,pos('13389|',temp),9);
       end;

     temp:='';
     temp:= memo1.Lines.Strings[i];
      while pos('12268|',temp)> 0 do
       begin
        p3:=p3+strtoint(copy(temp,pos('12268|',temp)+6,1));
        delete(temp,pos('12268|',temp),9);
       end;


   end;

   showmessage('p1:'+inttostr(p1)+#13#10+'p2:'+inttostr(p2)+#13#10+'p3:'+inttostr(p3));
end;
----------------------------------------------
to be ,not to be, is life!
until now, I still study life....
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2005/2/21 17:37:42
3楼: 用TStringList.Delimiter := '|',DelimitedText := 串 即可统计了。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 ptgfr (ptgfr) ★☆☆☆☆ -
盒子活跃会员
2005/2/21 17:42:46
3楼: procedure TForm1.Button1Click(Sender: TObject);
 var temp:string;
     i,t,p,p1,p2,p3:integer;
begin
   memo1.Text:='08568|2^13389|6^'+ #13#10+
'08568|1^12268|4^08568|6^'+#13#10+
'08568|4^13389|6^08568|1^13389|6^08568|3^13389|6^';

   p1:=0;
   p2:=0;
   p3:=0;
   p:=0;
   for i :=0  to memo1.Lines.Count-1  do
   begin
     temp:='';
     temp:= memo1.Lines.Strings[i];
      while pos('08568|',temp)> 0 do
       begin
        delete(temp,1,pos('08568|',temp)+5);
         if pos('^',temp)>0 then
          p1:=p1+strtoint(copy(temp,1,pos('^',temp)-1));
       end;

     temp:='';
     temp:= memo1.Lines.Strings[i];
      while pos('13389|',temp)> 0 do
       begin
        delete(temp,1,pos('13389|',temp)+5);
         if pos('^',temp)>0 then
          p2:=p2+strtoint(copy(temp,1,pos('^',temp)-1));
       end;

     temp:='';
     temp:= memo1.Lines.Strings[i];
      while pos('12268|',temp)> 0 do
       begin
        delete(temp,1,pos('12268|',temp)+5);
        if pos('^',temp)>0 then
         p3:=p3+strtoint(copy(temp,1,pos('^',temp)-1));
       end;
   end;
   showmessage('08568:'+inttostr(p1)+#13#10+'13389:'+inttostr(p2)+#13#10+'12268:'+inttostr(p3));
end;
----------------------------------------------
to be ,not to be, is life!
until now, I still study life....
作者:
男 xiaoshou (xiaoshou) ★☆☆☆☆ -
盒子活跃会员
2005/2/21 17:43:01
4楼: to ptgfr 如果有上万条记录,而且你要一个一个循环?;)
那太慢了!

iamdream请说清楚点!:)
----------------------------------------------
-
作者:
男 ptgfr (ptgfr) ★☆☆☆☆ -
盒子活跃会员
2005/2/21 18:05:24
4楼: procedure TForm1.Button2Click(Sender: TObject);
var temp:string;
     i,p,p1,p2,p3:integer;
begin
  memo1.Clear;
  memo1.Text:='08568|2^13389|6^'+ #13#10+
'08568|1^12268|4^08568|6^'+#13#10+
'08568|4^13389|6^08568|1^13389|6^08568|3^13389|6^';

  memo1.Lines.Delimiter:='^';
  memo1.Lines.DelimitedText:=memo1.Text;

   p1:=0;
   p2:=0;
   p3:=0;
   p:=0;
   for i :=0  to memo1.Lines.Count-1  do
   begin
     temp:='';
     temp:=trim(memo1.Lines.Strings[i]);

     if temp='' then
        break;

     p:= strtoint(copy(temp,1,5));
     case p of
     08568:
      begin
      delete(temp,1,pos('|',temp));
      p1:=p1+strtoint(temp);
      end;
     13389:
      begin
      delete(temp,1,pos('|',temp));
      p2:=p2+strtoint(temp);
      end;
     12268:
      begin
      delete(temp,1,pos('|',temp));
      p3:=p3+strtoint(temp);
      end;
     end;
   end;

  showmessage('08568:'+inttostr(p1)+#13#10+'13389:'+inttostr(p2)+#13#10+'12268:'+inttostr(p3));
end;
----------------------------------------------
to be ,not to be, is life!
until now, I still study life....
作者:
男 ptgfr (ptgfr) ★☆☆☆☆ -
盒子活跃会员
2005/2/21 18:09:03
5楼: 所有资料不用循环怎么做?
因为要历遍所有的资料字串啊!
若有人有更好的方法, 可以提出做法啊!!
----------------------------------------------
to be ,not to be, is life!
until now, I still study life....
作者:
男 jevons (jevons) ★☆☆☆☆ -
盒子活跃会员
2005/2/23 9:51:43
6楼: 我也有一个类似的程序
一个文本里面约有50万数据,我就是一条一条的读的
读到东西之后要跟数据库里面的东西比较
比较之后还要写到相应的几十个文本,不断的读写读写
慢死了,要差不多一个小时,惨

我也想知道有更好的方法
----------------------------------------------
-
作者:
男 ptgfr (ptgfr) ★☆☆☆☆ -
盒子活跃会员
2005/2/24 9:13:58
7楼: 排序内有一种叫二元树排序法或冒泡排序法
我昨天想了一下,
也许可以将资料切成多段行程,
然后个别处理,
最后再一起合并在一起做总整合.
这个应该会比较快.

例如楼上的有50万笔资料,
可以把它切成50个多绪来处理,
这样每一个单独的程序处理1万笔
它只要同时处理这1万笔就够了
时间也节省很多.
这是以空间换取时间的一种办法.
不过, 这程式写起来不好写就是了=.=
若写得不好, 可能很容易就死当
----------------------------------------------
to be ,not to be, is life!
until now, I still study life....
作者:
男 alexou (枫☆I believe I can fly~~~) ★☆☆☆☆ -
盒子活跃会员
2005/2/26 1:47:50
8楼: 凭您的话不明白你想做些什么,代码又懒得看。

在海量数据中搜索文本的话,有很多方式,下面是简单的两例:
如果.TXT是自己产生的,则首先使用Hash Table建索引。
如果.TXT不是自己的,用正则表达式。
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2005/2/26 8:14:55
9楼: 其实数据多则慢有个很重要的原因:你一次将所有数据读入内存了!所以要提高速度,除了以上所述方法,还应用“流”(TStream,如TMemoryStream,TFileStream)来分块读入,不过那样得自己按字符搜索了;
至于用TStringList,示例如下:
var
  iCount, i: Integer;
begin
  with TStringList.Create do
  begin
    Delimiter := '|';
    DelimiteredText := 你的串;
    iCount := 0;
    for i:=0 to Count-1 do
      if AnsiSameStr(Strings[i], '08568') then
        Inc(iCount);
  end;
end;

以上代码其实不会太慢,关键是你得一次将所有数据载入,在数据量大时就会很慢(光申请内存就得好长时间!),所以最好还是分块读入然后自己按字符串搜索。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 kingbill (踏雪寻梅) ★☆☆☆☆ -
盒子活跃会员
2005/3/25 13:18:30
10楼: 如果是数据库里面的记录用一条统计语句就可以统计出来了,
如果是些单独的文本的话,好像在<深度历险>有个非常快的文本排序工具
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行46.875毫秒 RSS