字串比對用法請教 |
缺席
|
alexder
一般會員 發表:3 回覆:4 積分:1 註冊:2003-06-25 發送簡訊給我 |
感謝各位前輩 有空來看小弟這篇 疑問..
小弟 有兩各檔案 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 發送簡訊給我 |
提供我的看法:
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 發送簡訊給我 |
|
CoffeeX
中階會員 發表:18 回覆:121 積分:72 註冊:2005-02-18 發送簡訊給我 |
補充一下, 可參考有 Ansi 開頭的函式,如 AnsiReplaceStr,AnsiCompareIC 以及 MyStringList->CommaText = "A pple,Ball,Car"; 則 MyStringList->strings[0] = "Apple";同理... 要不要試試看先將空白改成逗號, 然後用TStringList 的逗號分行功能, 你會很快就知道有幾組字串, 再把每一組比對就好,不知是否可完成你的需求,
------
=.=??? |
alexder
一般會員 發表:3 回覆:4 積分:1 註冊:2003-06-25 發送簡訊給我 |
感謝前輩的熱心指導,小弟前陣子在忙沒來回覆...
小弟有摘取先前前輩的語法來修改一下 不過發現 如果使用 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 發送簡訊給我 |
幫 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 發送簡訊給我 |
感謝 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 發送簡訊給我 |
我看的有一點不太懂@@,
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |