如何在檔案中搜尋某字串 |
答題得分者是:pceyes
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
我有一個檔案
其中它的格式如下: i love you/00232 this is a book/00254 a great of/03178 as soon as/05564... (後面還有一大串...) 而每個英文資料後面會有個/0做結尾(等同:i love you/00232) 且也沒有斷行(crlf) 我想要在當我輸入了as soon as時(查詢) 就在檔案裡查出來並且顯示後面的數值(/0除外) (as soon as和5564就好,英文資料和數值資料分開顯示or存放) 請問要怎麼實做呢? |
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
Unit1.pas
[code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; ListBox1: TListBox; Button1: TButton; ListBox2: TListBox; Button2: TButton; ListBox3: TListBox; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin // 二個(含以上)空白視為斷行,一個空白為斷字 edit1.Text := stringreplace(edit1.Text,' ',#13,[rfReplaceAll]); // 以下為清除三個、二個斷行 edit1.Text := stringreplace(edit1.Text,#13 #13 #13,#13,[rfReplaceAll]); edit1.Text := stringreplace(edit1.Text,#13 #13,#13,[rfReplaceAll]); // 丟給 listbox1 listbox1.items.text := edit1.Text; end; procedure TForm1.Button2Click(Sender: TObject); var i : integer; sl : tstringlist; s01, s02 : string; begin sl := tstringlist.Create; for i :=0 to listbox1.Items.Count -1 do begin // 把 /0 換成 斷行 sl.Text := stringreplace(listbox1.Items[i],'/0',#13,[rfReplaceAll]); s01 := trim(sl[0]); // as soon as 前多一個空白 s02 := sl[1]; listbox2.Items.Add(s01); listbox3.Items.Add(s02); end; sl.Free; end; end. [/code] Unit1.dfm [code delphi] object Form1: TForm1 Left = 192 Top = 107 Width = 544 Height = 375 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Edit1: TEdit Left = 32 Top = 16 Width = 457 Height = 21 ImeName = '中文 (繁體) - 倉頡' TabOrder = 0 Text = 'i love you/00232 this is a book/00254 a great of/03178' ' as soon as/05564' end object ListBox1: TListBox Left = 16 Top = 64 Width = 153 Height = 177 ImeName = '中文 (繁體) - 倉頡' ItemHeight = 13 TabOrder = 1 end object Button1: TButton Left = 88 Top = 272 Width = 145 Height = 49 Caption = 'Button1' TabOrder = 2 OnClick = Button1Click end object ListBox2: TListBox Left = 224 Top = 64 Width = 153 Height = 177 ImeName = '中文 (繁體) - 倉頡' ItemHeight = 13 TabOrder = 3 end object Button2: TButton Left = 328 Top = 272 Width = 161 Height = 41 Caption = 'Button2' TabOrder = 4 OnClick = Button2Click end object ListBox3: TListBox Left = 384 Top = 64 Width = 129 Height = 177 ImeName = '中文 (繁體) - 倉頡' ItemHeight = 13 TabOrder = 5 end end [/code]
------
努力會更接近成功 |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
[code delphi] procedure TForm1.Button3Click(Sender: TObject); var BigSl : Tstringlist; sl01, sl02,sl : tstringlist; i ,ii: integer; s,s01, s02 : string; begin s := edit3.text; // 你要找的字串 Bigsl := tstringlist.Create; try // 讀入文字檔 Bigsl.LoadFromFile(extractfilepath(application.ExeName) 'big.txt'); // 二個(含以上)空白視為斷行,一個空白為斷字 Bigsl.Text := stringreplace(Bigsl.Text,#32 #32,#13,[rfReplaceAll]); // 以下為清除三個、二個斷行 Bigsl.Text := stringreplace(Bigsl.Text,#13 #10 #13 #10 #13 #10,#13,[rfReplaceAll]); Bigsl.Text := stringreplace(Bigsl.Text,#13 #10 #13 #10,#13,[rfReplaceAll]); sl := tstringlist.Create; // 暫存用 sl01 := tstringlist.Create; // 放英文字串 sl02 := tstringlist.Create; // 放值 try // 整理檔案 分配到二個Stringlist for i :=0 to Bigsl.Count -1 do begin // 把 /0 換成 斷行 sl.Text := stringreplace(Bigsl[i],'/0',#13,[rfReplaceAll]); s01 := trim(sl[0]); // as soon as 前多一個空白 s02 := sl[1]; sl01.Add(s01); sl02.Add(s02); end; ii := sl01.IndexOf(s); if ii<>-1 then showmessage(sl02[ii]); //有找到 finally sl.free; sl01.free; sl02.free; end; finally bigsl.Free; end; end; [/code]
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-12-05 14:15:05, 註解 無‧
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
===================引 用 老大仔 文 章=================== To大大: 照您的程式碼來看 似乎是要全部都要載進去TStringList中然後做分割再來做比對 你說的對,但這方法除了標準外,速度也快,更符合你這個案子的特殊需求。缺點是檔案大小有限制,但這是檔案提供者的問題了。 那麼~ 請問有辦法在不要全部都載進去StringList中 而且是直接從file中就搜尋出來嗎? 這個主意很好,花了兩天找了一下,剛才才找到你已問過類似的問題了 http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=96134 可用FileRead來做嗎? 還是用TFileStream呢? 對! BlockRead最適合你要的方式,但問題我也幫你想到了,BlockRead的buf Size要如何設呢?如果切的結果,這個Block是as,下一個Block是Soon as 那你的句字就找不到了! 答案是這樣的,Block大小要設為1個Char,'as soon as'要跑10個迴圈,比對a之後再比下一個Block是不是s,下個是不是空白,最後檢查是不是\0,再取得你要的值,你可以測一下速度,再告訴我們速度如何。 Blockread的用法請參考: http://www.delphibasics.co.uk/RTL.asp?Name=BlockRead
------
努力會更接近成功 |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
嗯嗯~在檔案大小是有點問題
因為檔案還蠻大的@@ 我之前那篇是要用分割的 可是這篇是要用搜尋的 因為檔案不太一樣(就只差在後面有沒有/0和數據而已) 而這個檔案更大 所以想要知道是否有沒有類似用搜尋的方法來達成 因為我是想要使用類似以FindDialog來做 (相當於在記事本中使用FindDialog來搜尋) 假如是用記事本來開的話 要等超久的.... 我這兩天也是一直找版上的資料 可是好像不太好找>"< 看了您的建議後 我想我大概知道要怎麼去做了~ 謝謝您的建議和指教了^^ 不過~ 我還是想知道還有沒有別的方法可以實做 ===================引 用 pceyes 文 章=================== ===================引 用 老大仔 文 章=================== To大大: 照您的程式碼來看 似乎是要全部都要載進去TStringList中然後做分割再來做比對 你說的對,但這方法除了標準外,速度也快,更符合你這個案子的特殊需求。缺點是檔案大小有限制,但這是檔案提供者的問題了。 那麼~ 請問有辦法在不要全部都載進去StringList中 而且是直接從file中就搜尋出來嗎? 這個主意很好,花了兩天找了一下,剛才才找到你已問過類似的問題了 http://delphi.ktop.com.tw/board.php?cid=30&fid=1498&tid=96134 可用FileRead來做嗎? 還是用TFileStream呢? 對! BlockRead最適合你要的方式,但問題我也幫你想到了,BlockRead的buf Size要如何設呢?如果切的結果,這個Block是as,下一個Block是Soon as 那你的句字就找不到了! 答案是這樣的,Block大小要設為1個Char,'as soon as'要跑10個迴圈,比對a之後再比下一個Block是不是s,下個是不是空白,最後檢查是不是\0,再取得你要的值,你可以測一下速度,再告訴我們速度如何。 Blockread的用法請參考: http://www.delphibasics.co.uk/RTL.asp?Name=BlockRead
編輯記錄
老大仔 重新編輯於 2008-12-06 04:37:21, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |