請問「文件檔分類切割存檔」的問題~ |
答題得分者是:RaynorPao
|
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 請問各位前輩, 如何將一個文件檔,如: Title a11111 b11111 a22222 c11111 b33333 開啟然後以最前面的英文分類存成三個檔案,並加入最前面的"Title" 如: Title a11111 a22222 一個檔 Title b11111 b33333 一個檔 Title c11111 一個檔 因為文件的內容不一定(不只有a、b、c), 所以可能要考慮動態新增StringList來暫存,最後處理完再來存檔。 請各位前輩指點一下 國泰平安 >>< face="Verdana, Arial, Helvetica"> gemi0305 你好: 請參考以下的範例程式碼 < class="code"> TStringList *sl1=new TStringList; sl1->LoadFromFile("1.txt"); for(int i='a'; i<='z'; i ) { TStringList *sl2=new TStringList; sl2->Add(sl1->Strings[0]); for(int j=1; j
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
|
RaynorPao
版主 發表:139 回覆:3622 積分:7025 註冊:2002-08-12 發送簡訊給我 |
引言: 感謝包前輩~ 因為這工具程式是突然需要,趕著要在三、四十分鐘內寫出來, 想到來版上和大家討論一下~ 或許會得到幫助~ 因為沒寫過這個種東西,基本功不夠札實,呵 在我寫到一半時,就收到您的回覆~ 但我已經停不來了,就一股作氣寫完(因為時間有限) 雖然事後發現您寫的程式真的比我精媲太多了,果然出自高手~^^ 我用的方法和您有點不同,日後整理再 > 國泰平安 >>< face="Verdana, Arial, Helvetica"> gemi0305 你好: 有一點我想應該要提醒你一下,就是在我第一篇文章中回應的程式碼,其實有一 個很嚴重的隱憂,那就是迴圈的總數,例如: 假如原始檔案很小的話 (例如: 有 100 行),那迴圈的總數是 100*26=2600 次,應該很快就可以執行完成,但是假 如原始檔案很大的話 (例如: 有 10000 行),那迴圈的總數是 10000*26=260000 次,那應該就要等很久很久了,因此,為了避免這個效率上的問題,可以考慮動 態建立 26 個 TStringList,再依照字串中第一個字元的特徵,把字串分別放到 26 個 TStringList 裡面,最後再分別檢查 26 個 TStringList 的行數,如果 行數大於 1 的話,才有儲存成檔案的必要,如此一來,迴圈的總數頂多只需要 10000 26*2=10052 次 (26*2 是 26 個 TStringList 的動態建立/檢查、刪除) 不過,相對的~~這樣耗費的記憶體空間會比較多 (小弟我覺得還好啦),所以, 該怎麼做,就要好好的斟酌一下啦 --
------
-- 若您已經得到滿意的答覆,請適時結案!! -- -- 欲知前世因,今生受者是;欲知來世果,今生做者是 -- -- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 -- |
gemi0305
版主 發表:81 回覆:564 積分:629 註冊:2003-05-11 發送簡訊給我 |
包前輩,這是小弟的寫法,
大約整理一下,照我的題意表示,
其實我最後寫完的程式,不只可以對第一個字做分割依據, 可以對如:
A10251A2111111111
的第5、6字做為比對依據,因為可能這行data的這兩個字是表達一個address,
需要以這兩字為依掾,所以不限於第一個英文字, 以下的程式是我照此問題改寫我程式,
在主要分割的程式,如果有10000筆資料,只要花10000次的比對,
我跑拿來跑上萬筆資料,覺得還滿快的,
請參考看看: < class="code">
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TStringList *sl1 = new TStringList; if(OpenDialog1->Execute()) //開啟檔案
sl1->LoadFromFile(OpenDialog1->FileName); AnsiString TempTitle = sl1->Strings[0]; //先把第一行(title)暫存起來
sl1->Delete(0); //把第一行刪除 sl1->Sort(); //剩下的資料來排序,此為關鍵 AnsiString CheckWord = sl1->Strings[0].SubString(1,1); //CheckWord為第一字
TStringList *Box = new TStringList;
Box->Add(TempTitle);
//先加入title
for(int i=0; i
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |