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

TStringList 字串處理(分割統計)

缺席
caxton
一般會員


發表:5
回覆:3
積分:1
註冊:2007-02-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-04-28 14:57:38 IP:140.122.xxx.xxx 訂閱
欲處理的部份資料內容:
39199 33159 6674 5538 23224 7570 32500 214 40184
24960 3300 50117 28488 38078 36782 7494 2981 23683 23231
32187 33140 49226 66542 1268 2820 14761 3454
6824 7921 45021 15124 1269 13792 30603 66390

我要處理的資料格式大致如上,我先利用TStringList讀取,接下來要統計每個字串(以空格隔開)出現的次數,所以我必須把每行的字串再分割,請問各位先進要用什麼方式來做這個部份?因為我要處理的檔案約有200個,每個檔案裡面的字串數又不一定,所以卡在這邊不知道該怎麼實現。

下面是架構雛形:

<textarea name="code" class="cpp" rows="10" cols="60"> TStringList *slFile=new TStringList; slFile->LoadFromFile(Filename.c_str()); for(int i = 0; i < slFile->;Count; i ) Memo1->Lines->Add(slFile->Strings[i]); // 以下希望分割TStirngList所讀到的資料並加以統計每個字串出現次數(一個字串的形式為xxxxx) </textarea>
caxton
一般會員


發表:5
回覆:3
積分:1
註冊:2007-02-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-04-28 22:16:34 IP:211.74.xxx.xxx 訂閱
各位先進, 我從板上找了範例來使用, 不過有個問題存在, 使用StrSeg取得字串中的其中一個字是沒有問題的,
但若我用迴圈來重複跑StrSeg這個副程式,雖然編譯可以過, 但執行的時候會有問題..

以下是我部分source code:
<textarea class="cpp" rows="10" cols="60" name="code">//--------------------------------------------------------------------------- void __fastcall TForm1::VSM(AnsiString Filename) { int word; FILE *ReadPixel; AnsiString temp; vector OpVector; TStringList *slFile=new TStringList; ReadPixel = fopen(Filename.c_str(), "r"); slFile->LoadFromFile(Filename.c_str()); // 讀取整行字元 for(int i = 0; i < slFile->Count; i ) { //Memo1->Lines->Add(slFile->Strings[i]); for( int j = 1; j <= StrSegCount(slFile->Strings[i], " "); j ) { //這邊會有問題!!不知道為什麼..註解掉執行就不會有錯誤.. temp = StrSeg(slFile->Strings[i], " ", j); Memo1->Lines->Add(temp); OpVector.push_back(temp.ToInt()); } } for (int i = 0; i < (int)OpVector.size(); i ) Memo1->Lines->Add(OpVector[i]); OpVector.resize(0); fclose(ReadPixel); } //--------------------------------------------------------------------------- int __fastcall TForm1::StrSegCount(String Str , String SegSymbol) { int Result = 0; if ((Str == "")) return (Result); String c=SegSymbol; if (c == "") c=" "; int i = 0; String s = Str; String sTmp; while (s.Pos(c)>0) { i ; sTmp = s.SubString(1,s.Pos(c) - 1); s = s.SubString(s.Pos(c) c.Length() , s.Length() - (s.Pos(c) c.Length()) 1); } Result = i; return (Result); } //--------------------------------------------------------------------------- String __fastcall TForm1::StrSeg(String Str , String SegSymbol , int SegIndex) { String Result=""; if ((Str == "") || (SegIndex < 1)) return (Result); String c = SegSymbol; if (c == "") c = " "; int i = 0; String s = Str; String sTmp; while (s.Pos(c)>0) { i ; sTmp = s.SubString(1,s.Pos(c) - 1); if (SegIndex == i) { Result=sTmp; break; } s = s.SubString(s.Pos(c) c.Length() , s.Length() - (s.Pos(c) c.Length()) 1); } if (SegIndex == i 1) { Result = s; } return (Result); } //---------------------------------------------------------------------------</textarea>
編輯記錄
caxton 重新編輯於 2007-04-28 22:17:15, 註解 無‧
caxton 重新編輯於 2007-04-28 22:23:53, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-04-29 00:57:45 IP:61.64.xxx.xxx 訂閱
1. 設定分隔字元為「空白」
2. TStringList.LoadfromFile
3. TStringList.count 就是有幾個
4. 200 個檔 做 200 次
5. 得到答案
caxton
一般會員


發表:5
回覆:3
積分:1
註冊:2007-02-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-04-29 15:42:32 IP:140.122.xxx.xxx 訂閱
您好:

我想我敘述的可能不夠仔細..

每個檔案其實是一篇文章, 每個字原則以一串數字代表, 我要做的是將每篇文章所出現的字記錄下來, 並且把每個不同的字在同一篇文章中所出現的次數紀錄下來,
並非統計每篇文章中的字數, 因為接著我要把每一行的比重計算出來.

目前我是利用vector和map兩個搭配TFileList來達成, 多謝您的指教.
系統時間:2024-05-07 15:04:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!