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

如何在.txt檔案中,擷取所需的部份資訊 !?

答題得分者是:coldwind1234
x_i60
一般會員


發表:1
回覆:2
積分:0
註冊:2006-12-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-12-05 00:31:02 IP:59.112.xxx.xxx 未訂閱
y SolidWorks Corporation,32,308,15,308,15,3H001,1.,2,2HMM,50,0.125,13H06G      1
1029.212518,1E-008,499990.,11HTitan_Chang,,11,0,13H061029.212518; G 2
314,75.2941176470588,75.2941176470588,75.2941176470588,; 1P 1
502,8,25.,0.,-25.,-25.,50.,25.,25.,50.,25.,-25.,0.,25.,-25., 3P 2
50.,-25.,25.,50.,-25.,25.,0.,25.,-25.,0.,-25.; 3P 3
110,25.,0.,25.,25.,0.,-25.; 5P 4

我先讀入一個.txt的文字檔如上..
在其中我只需要特定的幾列資料為 如: 502開頭 "第二列" 到下一個分號結束的 "第三列"
以及 110開頭的 "第四列",下列為我所需要的資訊..
502,8,25.,0.,-25.,-25.,50.,25.,25.,50.,25.,-25.,0.,25.,-25., 3P 2
50.,-25.,25.,50.,-25.,25.,0.,25.,-25.,0.,-25.; 3P 3
110,25.,0.,25.,25.,0.,-25.; 5P 4
我之前是用C 來寫擷取字串,現在要改用BCB寫..其中有很多元件都不知道要怎麼用...
所以想要請前輩教我,如果我只單純用一個 button 與一個 memo,來執行擷取 並 顯示我所需要的資訊,要怎麼寫呢!?
之前有爬過文,但沒有找到類似的文章,所以在這想要麻煩前輩可以教教我一下,謝謝,感激不盡 ><
以下是我自己寫的C 程式碼:
string s1;
string s2="502",s3="110" ;
ifstream fin("003.txt");
ofstream fout1("001-1.text");

if(!fin){
cout<<"輸入檔案[001-1.igs]無法開啟"< return 1;
}
if(!fout1){
cout<<"輸出檔案[001-1.txt]無法開啟"< return 1;
}
while(!fin.eof()){
getline(fin,s1); //逐一讀取每一列字串
if(!( s1.find(s2) && s1.find(s3) ) //有找到以 s2,s3 為開頭的字串才記錄。
{
cout << s1 << endl;
fout1 << s1 << endl;
}
}
fin.close();
fout1.close();
getch();
return 0;
willishung
一般會員


發表:5
回覆:5
積分:2
註冊:2006-08-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-05 12:11:58 IP:211.20.xxx.xxx 未訂閱
 
AnsiString s2="502";
AnsiString s3="110" ;
TStringList *str=new TStringList();
str->LoadFromFile(".\\003.txt");
for(int i=0;i < str->Count;i )
{
if(!(str->Strings[i].Pos(s2) && str->Strings[i].Pos(s3)))
Memo1->Lines->Add(str->Strings[i]);
}
Memo1->Lines->SaveToFile(".\\001-1.text");

x_i60
一般會員


發表:1
回覆:2
積分:0
註冊:2006-12-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-05 15:05:16 IP:140.118.xxx.xxx 未訂閱
willishung 你好:
謝謝你的幫忙 ^^
但我照了你的方法使用,但它讀出來的資料是完整的原始資料,而不是如下面我所需要的資訊.. @@
502,8,25.,0.,-25.,-25.,50.,25.,25.,50.,25.,-25.,0.,25.,-25., 3P 2
50.,-25.,25.,50.,-25.,25.,0.,25.,-25.,0.,-25.; 3P 3
110,25.,0.,25.,25.,0.,-25.; 5P 4
coldwind1234
一般會員


發表:3
回覆:25
積分:20
註冊:2006-08-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-12-06 00:07:58 IP:220.134.xxx.xxx 未訂閱
猜測你的意思應該是:
先找到 502 或 110 (主Key)後,以分號做為結束位元,所以
主Key 跟 分號之間的所有資料就要全部加上去 memo 內
依照上述所需,寫了以下程式,請測試看看吧

void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString SysPath = ExtractFilePath(Application->ExeName); //取得執行檔路徑
AnsiString fname = SysPath "test.txt"; //取得資料檔檔名 test.txt
TStringList *dList = new TStringList();
AnsiString s1 = "502"; //搜尋字串1
AnsiString s2 = "110"; //搜尋字串2
byte FindStep; //搜尋步驟
int FindLine; //記錄找到的行號
dList->LoadFromFile(fname); //取得檔案內容
if (dList->Count>0)
{
Memo1->Clear();
FindStep = 0;
for (int i=0;iCount;i ) //一行一行找
{
FindLine = 0;
//開始找尋符合條件的行號
if (((dList->Strings[i].AnsiPos(s1)>0) || (dList->Strings[i].AnsiPos(s2)>0))&&(FindStep==0))
{
//找到後,記錄行號,並加到memo內
FindLine = i;
FindStep ;
Memo1->Lines->Add(dList->Strings[i]);
}
//以下為當找到 502 或 110 時,接著要找分號在哪
if (dList->Strings[i].AnsiPos(";")>0)
{
//找到分號後,判斷是否已經被加到memo內,如沒有,則加進去
if ((FindLine==0)&&(FindStep==1))
{
Memo1->Lines->Add(dList->Strings[i]);
FindStep = 0;
}
}
}
}
delete dList;
}
x_i60
一般會員


發表:1
回覆:2
積分:0
註冊:2006-12-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-12-06 02:05:47 IP:61.228.xxx.xxx 未訂閱
感謝 coldwind1234 的解答..
可能是我問題沒有寫的很清楚,不過大大確實猜測到我所要擷取的部份..
剛剛試著去使用大大所寫的程式碼..可以成功的擷取到..
剩下一些小地方,自己來修改就行了.. 真的很感謝 兩位大大 的熱心解答..
在這邊我想請問一下..
因為之前我都是用C 寫的,對BCB的一些元件,語法還不熟..
以一個新手來講的話,我應該要怎麼去上手呢 !?


CoffeeX
中階會員


發表:18
回覆:121
積分:72
註冊:2005-02-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-12-07 07:34:43 IP:140.125.xxx.xxx 訂閱
先懂怎麼看help檔,
快速找到相關的資料,然後閱讀整個架構,
TStringList 是一個元件(vcl),只要看到T開頭的都是Borland包裝好的,
以2006而言可在Borland help->w32->procedures->vcl procedures->adding and sorting strings
及Borland help->w32->reference->vcl for win32->classes->Classes->TStringList class
再來就是買一本書,可用於學習基本原件用法,
最後則是上ktop看看高手的作法,
------
=.=???
系統時間:2024-11-22 19:49:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!