辨識檔案內容並取特定文字出來 |
答題得分者是:Stallion
|
explorer5270
一般會員 發表:3 回覆:16 積分:3 註冊:2007-03-23 發送簡訊給我 |
各位大大,小弟有一文字檔(某部分)如下所示,因為我只會抓取固定行的值出來。
但因為feedrate1與feedrate2是"非固定"在第幾行出現, 想請問各位大大該如何去辨識檔案中的feedrate1與feedrate2, 並將他們(feedrate1與feedrate2)一一抓出來在Form上的個別Label上呢?? 謝謝!! Main:********************** id=0; feedrate1=500; feedrate2=500; step1=0.5; fextension=0; bextension=0; FlSt:********************** id=2; feedrate1=600; fluteod1=6; fluteod2=6; feedrate2=600; red=0.851; green=0.757; blue=0.589; GhMs:********************** id=3; red=0.851; feedrate1=80; feedrate2=80; blue=0.589; GhSt:********************** id=4; feedrate1=100; green=0.757; feedrate2=100; blue=0.589; PfSd:********************** id=5; feedrate1=300; feedrate2=300; red=0.1; green=0.5; blue=0;
------
Neil |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
沒有實際測試, 僅供參考
<textarea class="delphi" rows="10" cols="60" name="code"> for i:=0 to Memo1.Lines.Count -1 do begin if (Memo1.Lines[i][1]='i') and (Memo1.Lines[i][2]='d') then idvalue:=Memo1.Lines[i][4]; if (Memo1.Lines[i][1]='f') and (Memo1.Lines[i][2]='e') and (Memo1.Lines[i][3]='e') and (Memo1.Lines[i][4]='d') and (Memo1.Lines[i][5]='r') and (Memo1.Lines[i][6]='a') and (Memo1.Lines[i][7]='t') and (Memo1.Lines[i][8]='e') and (Memo1.Lines[i][9]='1') then begin if idvalue='0' then label1.Caption:= Memo1.Lines[i][10] Memo1.Lines[i][11] Memo1.Lines[i][12] ',' Memo1.Lines[i 1][10] Memo1.Lines[i 1][11] Memo1.Lines[i 1][12]; if idvalue='1' then label2.Caption:= Memo1.Lines[i][10] Memo1.Lines[i][11] Memo1.Lines[i][12] ',' Memo1.Lines[i 1][10] Memo1.Lines[i 1][11] Memo1.Lines[i 1][12]; if idvalue='2' then label3.Caption:= Memo1.Lines[i][10] Memo1.Lines[i][11] Memo1.Lines[i][12] ',' Memo1.Lines[i 1][10] Memo1.Lines[i 1][11] Memo1.Lines[i 1][12]; if idvalue='3' then label4.Caption:= Memo1.Lines[i][10] Memo1.Lines[i][11] Memo1.Lines[i][12] ',' Memo1.Lines[i 1][10] Memo1.Lines[i 1][11] Memo1.Lines[i 1][12]; if idvalue='4' then label5.Caption:= Memo1.Lines[i][10] Memo1.Lines[i][11] Memo1.Lines[i][12] ',' Memo1.Lines[i 1][10] Memo1.Lines[i 1][11] Memo1.Lines[i 1][12]; if idvalue='5' then label6.Caption:= Memo1.Lines[i][10] Memo1.Lines[i][11] Memo1.Lines[i][12] ',' Memo1.Lines[i 1][10] Memo1.Lines[i 1][11] Memo1.Lines[i 1][12]; end; end; </textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
Stallion
版主 發表:52 回覆:1600 積分:1995 註冊:2004-09-15 發送簡訊給我 |
寫了一個範例,請自行研究修改!
<textarea cols="60" rows="10" class="cpp" name="code"> TMemo *aMemo; int Count; const char *s1 = "feedrate1" , *s2 = "feedrate2"; try { this->Memo1->Clear(); aMemo = new TMemo(this) ; aMemo->Parent = this; aMemo->WordWrap = false; aMemo->Lines->LoadFromFile(".\\testdata.txt"); for ( Count = 0 ; Count < aMemo->Lines->Count - 1 ; Count ) { if ( aMemo->Lines->Strings[Count].Pos(s1) ) this->Memo1->Lines->Add( AnsiString(s1) " found at line " IntToStr(Count) ); if ( aMemo->Lines->Strings[Count].Pos(s2) ) this->Memo1->Lines->Add( AnsiString(s2) " also found at line " IntToStr(Count) ); } } __finally { aMemo->Free(); } </textarea> |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
explorer5270
一般會員 發表:3 回覆:16 積分:3 註冊:2007-03-23 發送簡訊給我 |
1.最少的ID是從0~3,最多是0~13個,所以當有14個ID就會有14個feedrate1與feedrate2。
2.feedrate2一定出現在feedrate1後面。 3.值一定要放在Label上,因為另有計算用途!! 4.因為Label固定放上28個,可否根據Main,FlSt,GhMs,GhSt,PfSd,PfSt來辨識feedrate1與feedrate2要固定放在第幾個Label上呢?? 舉例: a.當有Main,FlSt,FlSt,FlSt,GhMs,GhMs時,ID依序為0.1.2.3.4.5。 其中Main的feedrate1與feedrate2固定放在Label1與Label2, 第一個FlSt的feedrate1與feedrate2固定放在Label3與Label4, 第二個FlSt的feedrate1與feedrate2固定放在Label5與Label6, 第三個FlSt的feedrate1與feedrate2固定放在Label7與Label8, 第一個GhMs的feedrate1與feedrate2固定放在Label9與Label10, 第二個GhMs的feedrate1與feedrate2固定放在Label11與Label12,Label13~Label28不顯示。 b.當有Main,FlSt,GhMs,GhMs,GhSt,GhSt,PfSd,PfSd,PfSt,PfSt,PfSt,PfSt時,ID依序為0.1.2.3.4.5.6.7.8.9.10.11。 其中Main的feedrate1與feedrate2固定放在Label1與Label2, FlSt的feedrate1與feedrate2固定放在Label3與Label4,Label5~Label8不顯示, 第一個GhMs的feedrate1與feedrate2固定放在Label9與Label10, 第二個GhMs的feedrate1與feedrate2固定放在Label11與Label12, 第一個GhSt的feedrate1與feedrate2固定放在Label13與Label14, 第二個GhSt的feedrate1與feedrate2固定放在Label15與Label16, 只要有Pf開頭的feedrate1與feedrate2就固定從Label17與Label18依序放到Label27與Label28。 謝謝各位大大幫忙!! ===================引 用 pcboy 文 章=================== 請問是否固定會有 ID 0 到 ID 5 ? 因為Label元件是事先要放到Form上的, 幾個 Label 要先知道 feedrate2是否固定會出現在feedrate1後面? 一定要用 Label 顯示值嗎? 可以顯示到 Memo 上嗎? 這些值是另外有計算的用途?
------
Neil |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
如果您可以要求該純文字檔案輸出為.ini格式, 抓值會方便很多, 下面供您參考
<textarea class="delphi" rows="10" cols="60" name="code"> uses IniFiles, Registry; procedure TForm1.Button1Click(Sender: TObject); var MyIniFile: TIniFile; CustomIniFile1 : TCustomIniFile; MemIniFile1 : TMemIniFile; RegistryIniFile1 : TRegistryIniFile; IniFile1 : TIniFile; begin MyIniFile := TIniFile.Create('myapp.ini'); Memo1.Clear; MyIniFile.ReadSectionValues('Transfer', Memo1.Lines); if Memo1.Lines.Values['Title1'] <> 'Picture Painter' then MyIniFile.WriteString('Transfer', 'Title1', 'Picture Painter'); // MyIniFile.ReadSections(ListBox1.Items); // MyIniFile.ReadSection('Ports',Listbox2.Items); // MyIniFile.ReadSectionValues('Ports',ListBox3.Items); MemIniFile1.GetStrings(); MyIniFile.Free; { TCustomIniFile TMemIniFile TRegistryIniFile TIniFile blUseIniFile TCustomIniFile TMemIniFile TRegistryIniFile TIniFile } end; procedure TForm1.Button2Click(Sender: TObject); var MyIniFile: TIniFile; begin MyIniFile := TIniFile.Create('myapp.ini'); { if the entry wasn there before, delete it now } if Memo1.Lines.Values['Title1'] = '' then MyIniFile.DeleteKey('Transfer', 'Title1') { otherwise, restore the old value } else MyIniFile.WriteString('Transfer', 'Title1', Memo1.Lines.Values['Title1']); MyIniFile.Free; end; </textarea>
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
explorer5270
一般會員 發表:3 回覆:16 積分:3 註冊:2007-03-23 發送簡訊給我 |
因為無法輸出成ini檔案,所以抓不出來,請問大大還有別的方法嗎??
===================引 用 pcboy 文 章=================== 如果您可以要求該純文字檔案輸出為.ini格式, 抓值會方便很多, 下面供您參考 <textarea class="delphi" rows="10" cols="60" name="code">uses IniFiles, Registry; procedure TForm1.Button1Click(Sender: TObject); var MyIniFile: TIniFile; CustomIniFile1 : TCustomIniFile; MemIniFile1 : TMemIniFile; RegistryIniFile1 : TRegistryIniFile; IniFile1 : TIniFile; begin MyIniFile := TIniFile.Create('myapp.ini'); Memo1.Clear; MyIniFile.ReadSectionValues('Transfer', Memo1.Lines); if Memo1.Lines.Values['Title1'] <> 'Picture Painter' then MyIniFile.WriteString('Transfer', 'Title1', 'Picture Painter'); // MyIniFile.ReadSections(ListBox1.Items); // MyIniFile.ReadSection('Ports',Listbox2.Items); // MyIniFile.ReadSectionValues('Ports',ListBox3.Items); MemIniFile1.GetStrings(); MyIniFile.Free; { TCustomIniFile TMemIniFile TRegistryIniFile TIniFile blUseIniFile TCustomIniFile TMemIniFile TRegistryIniFile TIniFile } end; procedure TForm1.Button2Click(Sender: TObject); var MyIniFile: TIniFile; begin MyIniFile := TIniFile.Create('myapp.ini'); { if the entry wasn there before, delete it now } if Memo1.Lines.Values['Title1'] = '' then MyIniFile.DeleteKey('Transfer', 'Title1') { otherwise, restore the old value } else MyIniFile.WriteString('Transfer', 'Title1', Memo1.Lines.Values['Title1']); MyIniFile.Free; end; </textarea>
------
Neil |
explorer5270
一般會員 發表:3 回覆:16 積分:3 註冊:2007-03-23 發送簡訊給我 |
能否單存抓出feedrate1=80裡面的80值出來就好呢??
===================引 用 Stallion 文 章=================== 寫了一個範例,請自行研究修改! <textarea class="cpp" rows="10" cols="60" name="code"> TMemo *aMemo; int Count; const char *s1 = "feedrate1" , *s2 = "feedrate2"; try { this->Memo1->Clear(); aMemo = new TMemo(this) ; aMemo->Parent = this; aMemo->WordWrap = false; aMemo->Lines->LoadFromFile(".\\testdata.txt"); for ( Count = 0 ; Count < aMemo->Lines->Count - 1 ; Count ) { if ( aMemo->Lines->Strings[Count].Pos(s1) ) this->Memo1->Lines->Add( AnsiString(s1) " found at line " IntToStr(Count) ); if ( aMemo->Lines->Strings[Count].Pos(s2) ) this->Memo1->Lines->Add( AnsiString(s2) " also found at line " IntToStr(Count) ); } } __finally { aMemo->Free(); } </textarea>
------
Neil |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
explorer5270
一般會員 發表:3 回覆:16 積分:3 註冊:2007-03-23 發送簡訊給我 |
<textarea class="cpp" rows="10" cols="60" name="code">
for i:=0 to Memo1.Lines.Count -1 do //for i:=0會出錯??這是為什嗎? Memo1.Lines.Count是否要改成Memo1->Lines->Count呢??
begin if (Memo1.Lines[i][1]='f') and (Memo1.Lines[i][2]='e') and (Memo1.Lines[i][3]='e') and (Memo1.Lines[i][4]='d')
and (Memo1.Lines[i][5]='r') and (Memo1.Lines[i][6]='a') and (Memo1.Lines[i][7]='t') and (Memo1.Lines[i][8]='e') and (Memo1.Lines[i][9]='1') then </textarea>
===================引 用 pcboy 文 章=================== 利用 Stallion 提供的搜尋方法, 再類似小弟利用 if 或 switch 把值設定到不同 Label 關鍵告訴您, 苦工自己做, 請自己嘗試改看看吧
------
Neil |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
explorer5270
一般會員 發表:3 回覆:16 積分:3 註冊:2007-03-23 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |