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

計算字串 從檔案中讀取 .txt

尚未結案
stay
一般會員


發表:4
回覆:4
積分:1
註冊:2005-08-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-10 14:21:23 IP:61.67.xxx.xxx 未訂閱
目前碰到的問題 我可以把檔案讀入讀出 但要我計算字串的個數 不知如何下手 也看了很多的書 但都只提到計算數字的次數 也試著改過但一直無法成功 請個位大哥幫幫忙 有個文字檔.txt 要計算裡面字串的個數 例如 aa bb cc dd aa cc dd aa dd bb cc bb bb bb aa 出來的答案 aa 4 bb 4 cc 3 dd 3 請個位高手幫幫忙
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-10 16:32:22 IP:210.68.xxx.xxx 未訂閱
stay您好: 您可以將程式碼PO上來好讓前輩們看看題在哪邊    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 >
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-10 16:58:22 IP:218.15.xxx.xxx 未訂閱
您好:土炼法  
 procedure TForm1.Button2Click(Sender: TObject);
var
  sl,sl2:TStringList;
  i,j1,j2,j3,j4:integer;
begin
  j1:=0;
  j2:=0;
  j3:=0;
  j4:=0;
  Memo1.Lines.Clear;
  sl:=TStringList.Create;
  sl2:=TStringList.Create;
  sl.LoadFromFile('f:\1.txt');
  sl2.Text:=StringReplace(sl.Text ,' ',#13#10,[rfReplaceAll]);
   for i := 0 to sl2.Count - 1 do
     begin
       if sl2[i]='aa' then
         j1:=j1 1;
       if sl2[i]='bb' then
         j2:=j2 1;
       if sl2[i]='cc' then
         j3:=j3 1;
       if sl2[i]='dd' then
         j4:=j4 1;
     end;
   Memo1.Lines.Add('aa ' inttostr(j1));
   Memo1.Lines.Add('bb ' inttostr(j2));
   Memo1.Lines.Add('cc ' inttostr(j3));
   Memo1.Lines.Add('dd ' inttostr(j4));
end;
1.txt内容:
aa bb cc dd aa
cc dd aa dd bb
cc bb bb bb aa
在memo1中显示结果:
aa 4
bb 5 
cc 3
dd 3
是用delphi版答的您可自行转为> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
windblown
中階會員


發表:0
回覆:117
積分:98
註冊:2003-11-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-11 11:58:51 IP:61.229.xxx.xxx 未訂閱
c++ 版本,使用 STL  
#include 
#include 
using namespace std;
void Test()
{
  ifstream is = ifstream("test.txt");
  map words;
  //string inWord;
  while ( !is.eof() ) {
    char szBuf[200];
    is.getline(szBuf, 200);        char* pSplitStr=" "; // 用 " " 來分割字串
    char* pToken; // 接獲分割後的字串
    pToken=strtok(szBuf, pSplitStr); // 第一次分割
    while ( pToken ) {
      words[pToken]  ;
      pToken=strtok(NULL, pSplitStr);
    }
  }
  map::iterator it=words.begin();
  for ( ; it!=words.end();   it ) {
    int nCount = it->second;
    string str = it->first;
    cout << str << " " << nCount << endl;
  }
}
 
bb 應該是 5
stay
一般會員


發表:4
回覆:4
積分:1
註冊:2005-08-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-11 21:15:15 IP:210.209.xxx.xxx 未訂閱
我是要把下面java的版本改成c++ 是一個很浩大的工程 yed的部份就不用了可以沿用 import java.io.*; import java.util.*; public class KeyGraph {         String ori[][];    // 原始資料 行數         String dataP[][];  // 單一資料 頻率         int onedata;       // 單ㄧ資料個數         int N1,N2,N3;      // 刪去N1高頻,挑選N2剩餘高頻,刪去N3低頻         int K;             // 取前K各KEY跟N比照         int cluster;       // 跨幾各G         String data[][];   // 實際高頻獨立個體資料         String Redata[][]; // 實際剩於低頻獨立個體資料         String Findata[];// 最終紅圈         Vector t1 = new Vector();// 記紅圈位置         int marix[][];     // assoc關聯矩陣         int marix2[][];    // assoc次關聯矩陣         String marixMM[][];    // assocMM關聯矩陣         int assocThreshold;// assoc閥值         int assocThreshold2;// assoc次閥值         //----BFS-----         int visit[];   //標記已拜訪的矩陣         int queue[];         int front =-1;         int rear =-1;         int col,Vx,Vy;         Vector v1 = new Vector();//記次         Vector v2 = new Vector();//記個         //----BFS-----         //----KEY-----         int base[][];        // 字的BASE         int neighbor[];      // G鄰居值         double key[];        // 字的KEY值         //----KEY-----         int NKkey[];         // 既是N也是K(雙黑圈)         int Wkey[];          // 不N也不一定K(雙紅圈)         //-------------------計算單一資料與其頻率---------------------------------------         void countP(int count)         {                 Vector v = new Vector();                 int j =0,t=0;                 for(int i=0;i0) { if(t==0) v.addElement(new String(ori[i][0])); } t=0; } this.onedata = v.size(); dataP = new String[v.size()][2]; for(int i=0;ibig2) { big2 = tmp[j]; y=j; } } big[i]=y; big2=0; tmp[y]=-1; } this.data = new String[b][2]; // 設定前高頻陣列 this.Redata = new String[c][2];// 設定低頻陣列 for(int i=0;i"); W.writeData(""); W.writeData(""); W.writeData(""); int tmp[] = new int[N2]; for(int i=0;i"); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData("" data[NKkey[i]][0] ""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); } for(int i=0;i"); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData("" Findata[i] ""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); } for(int i=0;i"); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData("" data[i][0] ""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); } } } for(int i=0;i=assocThreshold&&replaceRed(data[j][0])==-1) // 都不是紅圈 { if (replaceRed(data[i][0])>-1) {//W.writeData(""); } else { W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData("" marix[i][j] ""); W.writeData("");} } // 紅虛線 for(int i=0;i=assocThreshold2) { W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData(""); W.writeData("" marix2[i][j] ""); W.writeData(""); } W.writeData(""); W.writeData(""); W.closeData(); } public static void main(String args[]) throws Exception { KeyGraph k = new KeyGraph(); k.assocThreshold = 3; // assoc閥值 k.assocThreshold2 = 2; // assoc次閥值 FileOpen F = new FileOpen("pos"); // 讀檔 檔名 k.ori = F.loadStringdata(args); // 讀資料存陣列 int dline = F.count; // 行數 k.countP(F.total); // 建立獨立資料與頻率 k.N1 = 0; k.N3 = 2; k.N2 = k.onedata-k.N3; // 刪去N1高頻,挑選N2剩餘高頻,刪去N3低頻 k.cluster = 2; // 跨G k.K = 10; // 取前K各KEY跟N比照(雙黑圈) k.dataFclean(k.N1,k.N2,k.N3); // 萃取實際資料 k.marix = new int[k.N2][k.N2]; // assoc矩陣初始化 k.assoc(F.total); // assoc計算 k.paint1(); // 製作第一次GRAPH k.bfs(); // BFS計算CLUSTER(G) // DEBUG 之前都ok //for(int i=0;i
stay
一般會員


發表:4
回覆:4
積分:1
註冊:2005-08-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-11 21:27:21 IP:210.209.xxx.xxx 未訂閱
上面的就是我要修改的 我現在就是碰到我所問到的困難的地方 我上次忘了說 除了讀檔進去還要讀出結果 我再把問題說一遍好了 最主要有兩的部分 第一個部分 是將所有讀入的字串做計算 算它在這個文件中出現了幾次 第二個部分 是以文件中的 每一行 為一個單位,計算
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-11 21:43:02 IP:59.115.xxx.xxx 未訂閱
stay 您好:    我也來試試,以下提供兩種方式供您參考:
方式一:
TStringList *slist = new TStringList;  // 使用 StringList 比較方便拆解資料
slist->LoadFromFile("c:\\tmp\\test.txt");  // 載入檔案內容
slist->Text = StringReplace(slist->Text, " ", "\r\n", TReplaceFlags()<Sort();  // 先排序一下,將相同名稱的資料排成連續的順序
AnsiString chk = "";  // 比對用的字串變數,初值設成空字串 (以下稱 "比對字樣")
int cnt = 0;  // 計算次數之用
for(int i=0; iCount; i  ){
    if(slist->Strings[i] != chk){  // 如果 "項目" 字樣與 "比對字樣" 不相同
        if(chk != ""){  // 如果不是與初值的空字串做比對 (第一次)
            Memo1->Lines->Add(slist->Strings[i-1] " = " IntToStr(cnt));  // 顯示 "項目" 字樣與出現次數
        }
        chk = slist->Strings[i];  // 將 "比對字樣" 更換成現在比對的 "項目" 字樣
        cnt = 1;  // 設定新的 "項目" 計數為 1
    }else{
           cnt  ;  // 累加計數
    }
}
Memo1->Lines->Add(chk " = " IntToStr(cnt));  // 顯示最後一個 "項目" 字樣與出現次數    delete slist;
*****************************************************
方式二:(配合 vector 來處理)
TStringList *slist = new TStringList;  // 使用 StringList 比較方便拆解資料
slist->LoadFromFile("c:\\tmp\\test.txt");  // 載入檔案內容
slist->Text = StringReplace(slist->Text, " ", "\r\n", TReplaceFlags()< item;  // 存放各個不同內容的 "項目" 字樣 (aa, bb, cc, dd)
vector  cnt;  // 存放對應於上方 "項目" 的出現次數    item.push_back(slist->Strings[0]);  // 先將第一個 "項目" 存入 item 陣列
cnt.push_back(1);  // 設定初值為 1 (已出現 1 次)    bool newItem;  // 是否為 "新出現" 項目的旗號
for(int i=1; iCount; i  ){
    newItem = true;  // 先假設現在比對的項目是 "新出現" 的項目
    for(int j=0; jStrings[i] == item[j]){  // 若是已經有相同內容的 "項目"
            cnt[j]  ;  // 累加計數值
            newItem = false;  // 不是 "新出現" 項目
            break;
        }
    }
    if(newItem){  // 如果是 "新出現" 的項目
        item.push_back(slist->Strings[i]);  // 添加該 "項目" 到 item 陣列中
        cnt.push_back(1);  // 設定初值為 1
    }
}    for(int i=0; iLines->Add(item[i] " = " IntToStr(cnt[i]));  // 顯示出 "項目" 字樣與出現次數
}    cnt.clear();
item.clear();
delete slist;
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/11 21:45:50
stay
一般會員


發表:4
回覆:4
積分:1
註冊:2005-08-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-12 23:55:57 IP:61.67.xxx.xxx 未訂閱
如果我要將我的java改寫成c 要如何連結yed呢 java用yed是很簡單但c 呢
系統時間:2024-11-22 20:32:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!