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

請問「文件檔分類切割存檔」的問題~

答題得分者是:RaynorPao
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-08 15:12:40 IP:210.66.xxx.xxx 未訂閱
請問各位前輩,    如何將一個文件檔,如: Title a11111 b11111 a22222 c11111 b33333    開啟然後以最前面的英文分類存成三個檔案,並加入最前面的"Title" 如: Title a11111 a22222 一個檔    Title b11111 b33333 一個檔    Title c11111 一個檔 因為文件的內容不一定(不只有a、b、c), 所以可能要考慮動態新增StringList來暫存,最後處理完再來存檔。    請各位前輩指點一下 國泰平安
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-08 15:38:17 IP:203.73.xxx.xxx 未訂閱
引言: 請問各位前輩, 如何將一個文件檔,如: 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; jCount; j ) { if(sl1->Strings[j].c_str()[0]==i) { sl2->Add(sl1->Strings[j]); } Application->ProcessMessages(); } char sz[2]={0}; sz[0]=(char)i; if(sl2->Count>1) sl2->SaveToFile((AnsiString)sz ".txt"); delete sl2; } delete sl1; -- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2003/08/08 16:17:07
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
gemi0305
版主


發表:81
回覆:564
積分:629
註冊:2003-05-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-08 22:30:06 IP:61.224.xxx.xxx 未訂閱
感謝包前輩~    因為這工具程式是突然需要,趕著要在三、四十分鐘內寫出來, 想到來版上和大家討論一下~ 或許會得到幫助~ 因為沒寫過這個種東西,基本功不夠札實,呵 在我寫到一半時,就收到您的回覆~ 但我已經停不來了,就一股作氣寫完(因為時間有限) 雖然事後發現您寫的程式真的比我精媲太多了,果然出自高手~^^ 我用的方法和您有點不同,日後整理再 > 國泰平安
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-08 23:01:21 IP:61.221.xxx.xxx 未訂閱
引言: 感謝包前輩~ 因為這工具程式是突然需要,趕著要在三、四十分鐘內寫出來, 想到來版上和大家討論一下~ 或許會得到幫助~ 因為沒寫過這個種東西,基本功不夠札實,呵 在我寫到一半時,就收到您的回覆~ 但我已經停不來了,就一股作氣寫完(因為時間有限) 雖然事後發現您寫的程式真的比我精媲太多了,果然出自高手~^^ 我用的方法和您有點不同,日後整理再 > 國泰平安 < 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-08 23:54:51 IP:61.224.xxx.xxx 未訂閱
包前輩,這是小弟的寫法, 大約整理一下,照我的題意表示, 其實我最後寫完的程式,不只可以對第一個字做分割依據,    可以對如: 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; iCount; i ) //開始分割 { if(sl1->Strings[i].SubString(1,1)==CheckWord) { Box->Add(sl1->Strings[i]); } else { Box->SaveToFile("c:\\" CheckWord ".txt"); CheckWord = sl1->Strings[i].SubString(1,1); Box->Clear(); Box->Add(TempTitle); Box->Add(sl1->Strings[i]); } } Box->SaveToFile("c:\\" CheckWord ".txt"); delete Box; delete sl1; ShowMessage("OK!!!"); } 國泰平安
系統時間:2024-06-26 6:33:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!