線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1311
推到 Plurk!
推到 Facebook!

如何從一篇文章裏得知某一字串重覆次數

答題得分者是:hagar
bnlonq1022
一般會員


發表:6
回覆:17
積分:4
註冊:2003-07-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-05 16:01:18 IP:140.128.xxx.xxx 未訂閱
如題! 請問各位先進,不曉得Delphi有沒有類似的函數可使用,或是有簡單的方法可解決! 小弟不才,還煩請各位幫忙!謝
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-05 16:21:39 IP:202.39.xxx.xxx 未訂閱
試試看:
var
  i, iPos: integer;
  sSearch: string;
  sl: TStringList;
begin
  sSearch:= 'SearchString';      sl := TStringList.Create;
  try
    i := 0;
    sl.LoadFromFile('c:\xx.txt');
    iPos := Pos(sSearch, sl.Text);
    while iPos <> 0 do
    begin
      Inc(i);
      Delete(sl.Text, iPos, Length(sSearch));
      iPos := Pos(sSearch, sl.Text);
    end;
  finally
    sl.Free;
  end;
  ShowMessage('出現 '   IntToStr(i)   ' 次');
end;
-- hagar.
bnlonq1022
一般會員


發表:6
回覆:17
積分:4
註冊:2003-07-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-05 17:09:39 IP:61.225.xxx.xxx 未訂閱
謝版主的幫忙 可是小弟我在編譯時會出錯,錯在Delete那行    Constant object cannot be passed as var parameter 紅色字為編譯後出現的錯誤訊息,小弟英文不是很好 不了解意思,煩請各位再幫忙一下!謝謝!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-05 17:21:50 IP:202.39.xxx.xxx 未訂閱
Sorry! 改一下:
var
  i, iPos: integer;
  sSearch, sTmp: string;
  sl: TStringList;
begin
  sSearch:= 'SearchString';      sl := TStringList.Create;
  try
    i := 0;
    sl.LoadFromFile('c:\xx.txt');
    sTmp := sl.Text;        iPos := Pos(sSearch, sTmp);
    while iPos <> 0 do
    begin
      Inc(i);
      Delete(sTmp, iPos, Length(sSearch));
      iPos := Pos(sSearch, sTmp);
    end;
  finally
    sl.Free;
  end;
  ShowMessage('出現 '   IntToStr(i)   ' 次');
end;
-- hagar.
bnlonq1022
一般會員


發表:6
回覆:17
積分:4
註冊:2003-07-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-05 17:25:53 IP:61.225.xxx.xxx 未訂閱
謝版大的回覆 小弟已解決問題了!
suda
一般會員


發表:17
回覆:63
積分:16
註冊:2002-05-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-05 17:44:11 IP:220.141.xxx.xxx 未訂閱
也可以用 posEx function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
bnlonq1022
一般會員


發表:6
回覆:17
積分:4
註冊:2003-07-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-05 21:58:39 IP:61.225.xxx.xxx 未訂閱
謝suda大大提供的方法,的確用PosEx也可以做到
suda
一般會員


發表:17
回覆:63
積分:16
註冊:2002-05-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-06 11:30:31 IP:220.141.xxx.xxx 未訂閱
再提供一個更快且適合大型檔案的方式 還可以使用分段載入memory的方式加上thread及循環串列等等, 以加快速度及資源的利用    
procedure TForm1.Button1Click(Sender: TObject);
var
  st:Tstringstream;
  charPos,MatchCharCount,MatchSCount,sLength:integer;
  s:string;
  c:char;
begin
  st:=tstringstream.create(memo1.Lines.Text);//可以換成filestream
  s:='abc';
  charPos:=1;
  sLength:=length(s);
  MatchCharCount:=0;
  MatchSCount:=0;
  repeat 
    st.read(c,1);
    if s[charpos]=c then
    begin
       inc(MatchCharCount);
       if MatchCharCount=sLength then
       begin
         inc(MatchSCount);
         charpos:=0;
       end;
       inc(charpos);
    end
    else
    begin
      if MatchCharCount>0 then
      begin
      charpos:=1;
      MatchCharCount:=0
      end;
    end;  
    
  until st.Position=st.Size ;
  st.free;
  showmessage(inttostr(MatchSCount));
end;
發表人 - suda 於 2005/05/06 11:46:05
系統時間:2024-05-17 11:54:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!