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

字串比對用法請教

缺席
alexder
一般會員


發表:3
回覆:4
積分:1
註冊:2003-06-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-10-03 14:57:28 IP:203.73.xxx.xxx 訂閱
感謝各位前輩 有空來看小弟這篇 疑問..
小弟 有兩各檔案 A , B 內有多行 字串, 如以A檔為基準 輸入 B檔 來比對 , 正確為 ture 錯 fail ,

先前爬文得知 用 String List , 字串陣列整批匯入比對 即可判斷,但,一行字串中 可能 有一兩個 tok 不同 ,其他皆相同..
例 : A -> VGA Driver 1.0.03, B -> VGA Display 1.0.03 , 兩各其實為 同一個,不過完全比對 就會有問題 ..

有朋友指點小弟 改用 fgets 匯入 strtok 做一個 tok 判斷, 符合一 match =1 繼續第二個 tok 比對 match =2 或是繼續下去 match 一定數及符合...

不過 小弟改寫本法,有點卡住,不知道 有大大是否有好的例子可以指點小弟..

我只想到用 雙 for 去刷..
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-10-03 18:06:26 IP:218.169.xxx.xxx 未訂閱
提供我的看法:
1/ 一行一行的讀入範本與比對檔。
2/ 把一行的字串使用空白來把token分開,範本行與比對行的token各存入一個 STL 之 multiset。
3/ 使用STL的一些演算法來比對這二個集合。
4/ 如何比對? 就看你的需求。比如說: 可以比對二者的token數與match數; 也可以用交集來比…這變成了數學的問題了!

蕭沖 qs.xiao@gmail.com
http://aftcast.blogspot.com/
生有涯而知無涯,以有涯隨無涯,殆矣

===================引 用 文 章===================
感謝各位前輩 有空來看小弟這篇 疑問..
小弟 有兩各檔案 A , B 內有多行 字串, 如以A檔為基準 輸入 B檔 來比對 , 正確為 ture 錯 fail ,

先前爬文得知 用 String List , 字串陣列整批匯入比對 即可判斷,但,一行字串中 可能 有一兩個 tok 不同 ,其他皆相同..
例 : A -> VGA Driver 1.0.03, B -> VGA Display 1.0.03 , 兩各其實為 同一個,不過完全比對 就會有問題 ..

有朋友指點小弟 改用 fgets 匯入 strtok 做一個 tok 判斷, 符合一 match =1 繼續第二個 tok 比對 match =2 或是繼續下去 match 一定數及符合...

不過 小弟改寫本法,有點卡住,不知道 有大大是否有好的例子可以指點小弟..

我只想到用 雙 for 去刷..
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-10-04 10:01:49 IP:140.125.xxx.xxx 訂閱

要不要試試看先將空白改成逗號,

然後用TStringList 的逗號分行功能,

你會很快就知道有幾組字串,

再把每一組比對就好,不知是否可完成你的需求,

------
=.=???
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-10-04 10:11:04 IP:140.125.xxx.xxx 訂閱

補充一下,

可參考有 Ansi 開頭的函式,如 AnsiReplaceStr,AnsiCompareIC

以及 MyStringList->CommaText = "A pple,Ball,Car";

則 MyStringList->strings[0] = "Apple";同理...
===================引 用 文 章===================

要不要試試看先將空白改成逗號,

然後用TStringList 的逗號分行功能,

你會很快就知道有幾組字串,

再把每一組比對就好,不知是否可完成你的需求,

------
=.=???
alexder
一般會員


發表:3
回覆:4
積分:1
註冊:2003-06-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-10-13 11:49:59 IP:203.67.xxx.xxx 訂閱
感謝前輩的熱心指導,小弟前陣子在忙沒來回覆...
小弟有摘取先前前輩的語法來修改一下
不過發現 如果使用 TStringList 分段 雖然可以拆開字串,不過跑到一半會卡住...
不知有前輩可以幫小弟修正一下?

[code]
{
TStringList *specword = new TStringList;
TStringList *resultword = new TStringList;

int iCount,i,jCount;

specword->LoadFromFile("c:\\spec2.ini");
specword->CommaText = specword->Text;

resultword->LoadFromFile("c:\\result2.ini");
resultword->CommaText = resultword->Text;

RichEdit2->Lines->AddStrings(specword);
RichEdit3->Lines->AddStrings(resultword);

for (int i=0; iCount; i ) {

for (int j=0; jCount; j ) {

if (resultword->Strings[i].LowerCase() == specword->Strings[j].LowerCase())
{

RichEdit1->Lines->Add(specword->Strings[j]);
break;
}
//else { //fail output gui
//RichEdit1->Lines->Add(specword->Strings[j]);

// break;}
}

}

delete specword;

delete resultword;
}
[/code]
而且小弟發現 如果 錯誤 輸出 else 添加反而顯示的重複的?
是否是小弟的迴圈問題?

===================引 用 文 章===================

要不要試試看先將空白改成逗號,
然後用TStringList 的逗號分行功能,
你會很快就知道有幾組字串,
再把每一組比對就好,不知是否可完成你的需求,
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-10-13 13:47:47 IP:61.229.xxx.xxx 未訂閱
幫 COFFEEX 回一下:

for (int i=0; iCount; i ) {

for (int j=0; jCount; j ) {

上面的 iCount 與 jCount 部份是否誤打?
1/ 它沒初始化,會造成無窮迴圈,於是卡住
2/ 就算有初始化,那也應該是 i < iCount 之類的條件式。

另外,照這個方案來比對的話,會有一個潛在的問題,你不一定會發生,但提醒你一下:
照你之前所說的「並不完全都一樣」需要模糊比對,for example :
範本是 VGA 1.2.3 display
要比對的是 VGA display 1.2.3
於是你循序的比對3個token結果會產生「合、不合、不合」,但事實上是一樣的。
故之前我建議將結果存入集合中,用集合來比對,就沒有順序的問題。

蕭沖 qs.xiao@gmail.com
http://aftcast.blogspot.com/
--All ideals are worthless unless implemented--
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
alexder
一般會員


發表:3
回覆:4
積分:1
註冊:2003-06-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-10-19 13:36:45 IP:220.135.xxx.xxx 訂閱
感謝 aftcast 前輩提示
小弟 已經修正了
兩個 for 迴圈 改用
for (int i=0; i < iCount ; i ) {

for (int j=0; i > j ; j ) {

並另外宣告 iCount 數量
不過 小弟另外發現,雖然迴圈的 錯誤解決了 不過 如果讀入大檔 (檔案 多行)
其判斷式 就會錯誤,小的檔案 或是 只有數行 就可以比較..

請問是還要另外在宣告嗎?

alex / alexder01@yahoo.com.tw

===================引 用 文 章===================
幫 COFFEEX 回一下:

for (int i=0; iCount; i ) {

for (int j=0; jCount; j ) {

上面的 iCount 與 jCount 部份是否誤打?
1/ 它沒初始化,會造成無窮迴圈,於是卡住
2/ 就算有初始化,那也應該是 i < iCount 之類的條件式。

另外,照這個方案來比對的話,會有一個潛在的問題,你不一定會發生,但提醒你一下:
照你之前所說的「並不完全都一樣」需要模糊比對,for example :
範本是 VGA 1.2.3 display
要比對的是 VGA display 1.2.3
於是你循序的比對3個token結果會產生「合、不合、不合」,但事實上是一樣的。
故之前我建議將結果存入集合中,用集合來比對,就沒有順序的問題。

蕭沖 qs.xiao@gmail.com
http://aftcast.blogspot.com/
--All ideals are worthless unless implemented--
CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-12-30 22:34:16 IP:140.125.xxx.xxx 訂閱
我看的有一點不太懂@@,
AnsiString MyAnsi = "a,b,c"
MyStringList1 ->LoadFromFile("1.txt");
int TotalCount = MyStringList->Count;//不是可以知道到底有幾行嗎?
MyStringList2->CommaText = MyAnsi ;
int TotalElement = MyStringList2->Count;//不是可以知道有幾個元素?
所謂的另外宣告,意思是?
感覺上aftcast大大的作法應當比較好,
不過我沒有用過這方面的function,
主要只用過vector...~~"
不知要參考STL的哪個部份?學習一下^^
------
=.=???
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-01-01 17:27:52 IP:140.118.xxx.xxx 未訂閱
不好意思,我沒時間仔細看這個問題。
我看標題來猜測,你可以使用Boyer-Moore的方法來做字串的比對。
系統時間:2024-05-04 21:33:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!