全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3483
推到 Plurk!
推到 Facebook!

如何在檔案中搜尋某字串

答題得分者是:pceyes
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-05 04:14:25 IP:59.114.xxx.xxx 訂閱
我有一個檔案
其中它的格式如下:
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-05 05:56:05 IP:220.141.xxx.xxx 訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-05 12:19:03 IP:59.114.xxx.xxx 訂閱
謝謝大大的指導
可是~大大好像有點誤會我的意思了@@
我是想要在檔案中搜尋某字串
並且顯示該字串的數據資料

-----
舉例來說好了~
我在edit中輸入了as soon as
然後
就會在檔案中搜尋這個字串
並且把它的資料也給帶出來~
-----
但是這個檔案是沒有斷行的
所以我不太了解要怎麼去從中搜尋>"<
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-05 14:11:14 IP:122.118.xxx.xxx 訂閱

[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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-05 16:02:17 IP:59.114.xxx.xxx 訂閱
To大大:
照您的程式碼來看
似乎是要全部都要載進去TStringList中然後做分割再來做比對
那麼~
請問有辦法在不要全部都載進去StringList中
而且是直接從file中就搜尋出來嗎?
可用FileRead來做嗎?
還是用TFileStream呢?
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-05 21:41:04 IP:220.141.xxx.xxx 訂閱

===================引 用 老大仔 文 章===================
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-06 04:34:59 IP:59.114.xxx.xxx 訂閱
嗯嗯~在檔案大小是有點問題
因為檔案還蠻大的@@
我之前那篇是要用分割的
可是這篇是要用搜尋的
因為檔案不太一樣(就只差在後面有沒有/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, 註解 無‧
系統時間:2024-05-15 9:03:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!