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

處理極大的TXT檔 怎樣可以有效率的搜尋刪除裡面的內容?

尚未結案
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-06 23:42:09 IP:210.68.xxx.xxx 未訂閱
搜尋了半天 找不到解決我問題的方法 麻煩大家了 我程式的寫法還在規劃中 目前是想把所有的資料存成txt檔 資料內容單筆可能是4~9的字元 可是資料量可能多達 10的9次方 另外 我有一個StringGrid 需求就是 出現在StringGrid裡的值 跟txt比對 有相同的就從txt檔裡刪除 請問該怎樣去設計 如果只能用笨方法 每次都從檔案開頭一筆一筆比對 遇到一樣的刪除 又該怎麼做呢 可能很多人已經回答過了 找了一天文章 眼花花 真的沒發現 希望不厭其煩在回答我一次 感謝
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-07 09:23:29 IP:211.23.xxx.xxx 未訂閱
引言: 搜尋了半天 找不到解決我問題的方法 麻煩大家了 我程式的寫法還在規劃中 目前是想把所有的資料存成txt檔 資料內容單筆可能是4~9的字元 可是資料量可能多達 10的9次方 另外 我有一個StringGrid 需求就是 出現在StringGrid裡的值 跟txt比對 有相同的就從txt檔裡刪除 請問該怎樣去設計 請參考 【BCB】【問題】檔案比對 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49608 每次要增加資料到txt 而不是整個覆蓋掉要怎麼做我只知道SaveToFile可以寫入 請參考 【BCB】【問題】如何更改二進制檔的內容 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=48278 如果只能用笨方法 每次都從檔案開頭一筆一筆比對 遇到一樣的刪除 又該怎麼做呢 可能很多人已經回答過了 找了一天文章 眼花花 真的沒發現 希望不厭其煩再回答我一次 萬分感謝 我把想寫的題目也說明一下好了 搞不好有高手想到我完全想不到的方法 我上的AI課程 老師要我們寫超變態猜數字 字數不限 值也不限(我想用1~9 a~z A~Z) 這樣可能性已經多到誇張了 判斷的方法 我打算用類似基因比對的演算法 配合消去法 可是苦於對程式寫法不熟 無能為力.... <>> < face="Verdana, Arial, Helvetica"> ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D -------------------------------
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-14 03:20:39 IP:210.68.xxx.xxx 未訂閱
抱歉 程度太差 研究幾天的結果 我還是用稍微熟悉的memo去實作可是我發現 光是產生一個aaa.txt 裡面是0000~9999 用下面的程式去除有重複性制的數字 例如 1123 就要跑好久 五位數的更高達數小時 是程序的寫法太遜嗎 /. 
txt檔裡的存法是
0000
0001
0002
0003
.
.
. 
        AnsiString tmp;
        int i,j,k=0,size=4,t=0;
        char txt[key_size]={0},check[key_size],key[key_size];
        bool b=true;
        Form1->Memo1->Lines->LoadFromFile("aaa.txt");
        while(k<Form1->Memo1->Lines->Count)
        {
                b=true;
                tmp = Memo1->Lines->Strings[k];
                strcpy(&key[0],tmp.c_str());
                    for(i=0;iMemo1->Lines->Delete(k);
                                                        k=k-1;
                                                        b=false;
                                                        break;
                                                }
                                        }                                    }
                                if(b==false)
                                break;
                        }
        k=k 1;            }
        Form1->Memo1->Lines->SaveToFile("ccc.txt");
第二個問題 當我程式中 猜的值為1234 結果是2A 那123X 12X4 1X34 X234(x為任意數字) 都是不可能的解 又該如何去刪除呢 如果用Memo1->Lines->Strings[k];搜尋 加上 把一筆資料拆成key[]四個值去逐一比對 刪除 跑好幾天都跑不完阿 T_T 第三個問題 如果是用TStringList 去作處理 是不是txt裡面一定要用逗號分開資料? 我看很多文章都是用 AnsiString sz=StringReplace(sl1->Strings[i], " ", ",", TReplaceFlags()<
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-14 11:05:32 IP:61.70.xxx.xxx 未訂閱
引言: 抱歉 程度太差 研究幾天的結果 我還是用稍微熟悉的memo去實作可是我發現 光是產生一個aaa.txt 裡面是0000~9999 用下面的程式去除有重複性制的數字 例如 1123 就要跑好久 五位數的更高達數小時 是程序的寫法太遜嗎 /.
txt檔裡的存法是
0000
0001
0002
0003
.
.
. 
        AnsiString tmp;
        int i,j,k=0,size=4,t=0;
        char txt[key_size]={0},check[key_size],key[key_size];
        bool b=true;
        Form1->Memo1->Lines->LoadFromFile("aaa.txt");
        while(k<Form1->Memo1->Lines->Count)
        {
                b=true;
                tmp = Memo1->Lines->Strings[k];
                strcpy(&key[0],tmp.c_str());
                    for(i=0;iMemo1->Lines->Delete(k);
                                                        k=k-1;
                                                        b=false;
                                                        break;
                                                }
                                        }                                    }
                                if(b==false)
                                break;
                        }
        k=k 1;            }
        Form1->Memo1->Lines->SaveToFile("ccc.txt");
第二個問題 當我程式中 猜的值為1234 結果是2A 那123X 12X4 1X34 X234(x為任意數字) 都是不可能的解 又該如何去刪除呢 如果用Memo1->Lines->Strings[k];搜尋 加上 把一筆資料拆成key[]四個值去逐一比對 刪除 跑好幾天都跑不完阿 T_T 第三個問題 如果是用TStringList 去作處理 是不是txt裡面一定要用逗號分開資料? 我看很多文章都是用 AnsiString sz=StringReplace(sl1->Strings[i], " ", ",", TReplaceFlags()<
第一個問題: 你試試下面這一段Code,我的電腦大概1秒鐘就可以建立0000~9999並且不包含重複數字喔,只是技巧的問題啦,我想有時候要用歸納法推一下....
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int sum=0;  //驗證答案用
    for(int i=0; i<10 ; i  )
        for(int j=i 1; j<10 ; j  )
            for(int k=j 1; k<10 ; k  )
                for(int m=k 1; m<10 ; m  )
                {
                    Memo1->Lines->Add( ((AnsiString)i)   ((AnsiString)j)   ((AnsiString)k)   ((AnsiString)m) );
                    sum  ;
                }
    Edit1->Text = (AnsiString) sum;
}
答案剛好是210 = (10!) / ((4!)* (6!)) 第二個問題: 如果要照你的方法處裡的話,建議你自定資料結構,這樣處理會快一點,例如定成 < class="code"> struct S_TestStruct { bool Passable; char Num[4]; }TestStruct; 因為每次有多少Item事先都可以算得出來,用AnsiString 或 TStringList處裡太慢 頂多加上排列組合多24倍(4!) 第三個問題我不會......
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-14 11:45:05 IP:203.70.xxx.xxx 未訂閱
其實這題目以前老師也出過,把剛剛建議你的STRUCT改一下
 
struct S_TestStruct
{
    int     Passable;
    char    Num[4];
}TestStruct;
初始化把每個Struct的Passable設為0 ,每猜一次若有可能符合的話Passable加 1 ,若判定為不可能Passable設為 -1, 每次隨機取一個Passable最大的值去猜 PS:這是多年以前寫的,我只能提供大概方向,這程式比較難的地方是如何判斷是否有可能符合
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-14 14:13:02 IP:210.68.xxx.xxx 未訂閱
引言: 其實這題目以前老師也出過,把剛剛建議你的STRUCT改一下
 
struct S_TestStruct
{
    int     Passable;
    char    Num[4];
}TestStruct;
初始化把每個Struct的Passable設為0 ,每猜一次若有可能符合的話Passable加 1 ,若判定為不可能Passable設為 -1, 每次隨機取一個Passable最大的值去猜 PS:這是多年以前寫的,我只能提供大概方向,這程式比較難的地方是如何判斷是否有可能符合
感謝 對齁 我都忘記設passable 最近一直在煩惱字串處理和速度的問題 /.不過我最大的問題是 現在用4個數字在實作猜數字 可以了之後再慢慢增加 因為程式還頗菜 為什麼STRUCT可以增加速度阿 很明顯的嗎?(嘗試中) 我以前只知道struct看程式碼比較方便 一個不該是程式新手的新手 /.
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-14 14:23:42 IP:210.68.xxx.xxx 未訂閱
第一個問題: 你試試下面這一段Code,我的電腦大概1秒鐘就可以建立0000~9999並且不包含重複數字喔,只是技巧的問題啦,我想有時候要用歸納法推一下....
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int sum=0;  //驗證答案用
    for(int i=0; i<10 ; i  )
        for(int j=i 1; j<10 ; j  )
            for(int k=j 1; k<10 ; k  )
                for(int m=k 1; m<10 ; m  )
                {
                    Memo1->Lines->Add( ((AnsiString)i)   ((AnsiString)j)   ((AnsiString)k)   ((AnsiString)m) );
                    sum  ;
                }
    Edit1->Text = (AnsiString) sum;
}
答案剛好是210 = (10!) / ((4!)* (6!)) [/
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-14 16:30:18 IP:203.70.xxx.xxx 未訂閱
1.倒不是struct就比較快,而是就這個程式而言,用BCB的AnsiString做處裡沒有直接把數字拆解來處理快(程式也比較容易寫).        2. 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int sum=0;  //驗證答案用
    for(int i=0; i<10 ; i  )
        for(int j=i 1; j<10 ; j  )
            for(int k=j 1; k<10 ; k  )
                for(int m=k 1; m<10 ; m  )
                {
                    Memo1->Lines->Add( ((AnsiString)i)   ((AnsiString)j)   ((AnsiString)k)   ((AnsiString)m) );
                    //把i,j,k,m做排列組合就好啦,所以SUM的答案是210*(4!)
                    sum  ;
                }
    Edit1->Text = (AnsiString) sum;
} 
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-14 17:24:50 IP:211.74.xxx.xxx 未訂閱
建議第一個問題使用ADD不要使用DELETE
使用TStringList
ADD方法
 陣列會從後方加,無移動陣列
DELETE方法
 陣列從中間移除後,中間到尾端往前移一格(你的程式在這兒時間浪費掉了)
使用DELETE的方法
先建立一個TStrings用add方法,再使用assing方法將整個copy過去(要移,移一遍就好,不然時間都浪費了)。
學而時習之不亦樂乎! 發表人 - jest0024 於 2004/05/14 17:28:13
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-14 17:27:05 IP:211.74.xxx.xxx 未訂閱
拍謝,按修改又按到回覆了>.<" 發表人 - jest0024 於 2004/05/14 17:29:14
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-14 18:04:28 IP:210.68.xxx.xxx 未訂閱
引言:
建議第一個問題使用ADD不要使用DELETE
使用TStringList
ADD方法
 陣列會從後方加,無移動陣列
DELETE方法
 陣列從中間移除後,中間到尾端往前移一格(你的程式在這兒時間浪費掉了)
使用DELETE的方法
先建立一個TStrings用add方法,再使用assing方法將整個copy過去(要移,移一遍就好,不然時間都浪費了)。
學而時習之不亦樂乎! 發表人 - jest0024 於 2004/05/14 17:28:13
因為之前都沒有String的概念 用BCB才開始接觸 翻好久的文章 和看書都一知半解 無法實作 能給點方向嗎? 像我之前提到的txt檔 怎樣可以把它擷取在TStringList 並拿來作比對 刪除的動作 先建立一個TStrings用add方法,再使用assing方法將整個copy過去 <==完全沒概念 真是尷尬.... 一個不該是程式新手的新手 /.\
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-15 16:09:29 IP:211.74.xxx.xxx 未訂閱
TStrings List = New TStringList; List->Add(String); .... .... List->Add(String); Memo1.List.Assing(List); delete List; 學而時習之不亦樂乎!
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-17 19:33:55 IP:210.68.xxx.xxx 未訂閱
完蛋 程式已經完成50%左右 可是 堅持用array寫的結果 我發現爆掉了 如果需要建立array[99999999][10] 這麼大的陣列 有可能嗎 =.= 最主要是要和另一個陣列來比對例如 key[10] 就是拿key[10]跟array[0][10]~array[99999999][10]比對 可以的話也會慢到爆吧 請問該怎麼辦 T_T 一個不該是程式新手的新手 /.\
fredguo
一般會員


發表:0
回覆:1
積分:0
註冊:2004-04-20

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-05-19 15:18:32 IP:61.218.xxx.xxx 未訂閱
array[99999999][10] = array[9999][9999][10] Data Structure的書有關比對議題可參考 大概是將array[99999999][10] 做索引後 當Key做比對錯誤時,無需從Key源頭開始找 它可以跳著找
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-05-19 17:42:36 IP:61.70.xxx.xxx 未訂閱
引言: 完蛋 程式已經完成50%左右 可是 堅持用array寫的結果 我發現爆掉了 如果需要建立array[99999999][10] 這麼大的陣列 有可能嗎 =.= 最主要是要和另一個陣列來比對例如 key[10] 就是拿key[10]跟array[0][10]~array[99999999][10]比對 可以的話也會慢到爆吧 請問該怎麼辦 T_T 一個不該是程式新手的新手 /.
我想你比對的方向搞錯了喔,之前我曾建議你用Struct但是不代表你要建出所有的KEY值加以比對, 正確的做法應該是再加上動態產生你所需要的KEY值喔,我寫一段範例好了:
 
class TestClass
{
    public:
    int     Passable;
    char    *Num;        TestClass()
    {
        Num = NULL;
    };        void CreateKey(int n=4)
    {
        if(Num)
            delete Num;
        Num = new char[n];
    }        ~TestClass(void)
    {
        if(Num)
            delete Num;
    };
};    void __fastcall TForm1::FormCreate(TObject *Sender)
{
    int WordNum = 10; //0~9 10 共10個數字
    int Choice = 4;   //取4個數字
    int Total=1;
    for(int i = WordNum-Choice-1 ; i<= WordNum ; i  )  //計算共有幾個key值
        Total*= i;
    TestClass *Key;
    Key = new TestClass[Total];
    for(int i = 0 ; i     
        
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-05-19 18:01:11 IP:61.70.xxx.xxx 未訂閱
對了順便告訴你2個加速的方式,以我剛剛的範例而言,當比對到某個KEY不可能的時候,除了把PASSABLE設為-1以外,更可以把他SWAP到array的最後面,然後用一個變數紀錄目前有效KEY的個數,下次就不用再比對;另外比對的時候根據不同的狀況,Passable值可以+1,+2,+3....(可能性越高加越多),不一定每次只加1
雞排
一般會員


發表:16
回覆:40
積分:11
註冊:2004-03-10

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-05-19 23:37:22 IP:210.68.xxx.xxx 未訂閱
引言: 對了順便告訴你2個加速的方式,以我剛剛的範例而言,當比對到某個KEY不可能的時候,除了把PASSABLE設為-1以外,更可以把他SWAP到array的最後面,然後用一個變數紀錄目前有效KEY的個數,下次就不用再比對;另外比對的時候根據不同的狀況,Passable值可以 1, 2, 3....(可能性越高加越多),不一定每次只加1 < face="Verdana, Arial, Helvetica"> 謝拉 提供了我不少方向 不過 如果這樣做的話 我一開始特地排序加快搜尋就沒用 再加上 這樣做真的很浪費時間和空間 所以我打算把銷去法拿掉 專心在基因比對的演算法 另外 真的感謝大家幫我的忙 可是分數只能給一個 請大家多多見諒 ^^ 一個不該是程式新手的新手 /.\
系統時間:2024-11-25 9:42:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!