gemi0305
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:81 回覆:564 積分:629 註冊:2003-05-11
發送簡訊給我
|
請問各位前輩, 如何將一個文件檔,如:
Title
a11111
b11111
a22222
c11111
b33333 開啟然後以最前面的英文分類存成三個檔案,並加入最前面的"Title"
如:
Title
a11111
a22222
一個檔 Title
b11111
b33333
一個檔 Title
c11111
一個檔
因為文件的內容不一定(不只有a、b、c),
所以可能要考慮動態新增StringList來暫存,最後處理完再來存檔。 請各位前輩指點一下 ![]() 國泰平安
|
RaynorPao
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/download.php?download=upload/48c9d66ac5033_KTOP-%E5%8C%85%E5%AD%90%28%E7%9C%BC%E9%8F%A1%29-Q-100x100.jpg) 發表: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; 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
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:81 回覆:564 積分:629 註冊:2003-05-11
發送簡訊給我
|
感謝包前輩~ 因為這工具程式是突然需要,趕著要在三、四十分鐘內寫出來,
想到來版上和大家討論一下~ ![]() 或許會得到幫助~
因為沒寫過這個種東西,基本功不夠札實,呵
在我寫到一半時,就收到您的回覆~
但我已經停不來了,就一股作氣寫完(因為時間有限)
雖然事後發現您寫的程式真的比我精媲太多了,果然出自高手~^^ 我用的方法和您有點不同,日後整理再 > 國泰平安
|
RaynorPao
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://delphi.ktop.com.tw/download.php?download=upload/48c9d66ac5033_KTOP-%E5%8C%85%E5%AD%90%28%E7%9C%BC%E9%8F%A1%29-Q-100x100.jpg) 發表: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
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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 Count; 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!!!"); } 國泰平安
|