如何取出字串資料 |
答題得分者是:pceyes
|
demon740405
一般會員 ![]() ![]() 發表:6 回覆:10 積分:3 註冊:2005-12-10 發送簡訊給我 |
我有數筆資料,它的資料格式如下:
[78:06:32]46684531 [32:15:65][55:87:01][11:59:88][01:07:67]355579841 基本上都是中括號所組成的 請問要如何取出中括號裡的值呢??(分別都要取出) 並且要也把46684531、355579841也取出 讓它變成如下: 78:06:32 46684531 32:15:65 35579841 55:87:01 35579841 11:59:88 35579841 01:07:67 35579841 (左右邊各以listbox來儲存方便比對用) 因為每行的資料都由不固定的中括號組成(有的會有三~五個中括號) 所以很頭痛>"<
------
** 何須劍道爭鋒? 千人指,萬人封; 可問江湖鼎峰? 三尺秋水塵不染, 天 下 無 雙 ** 編輯記錄
demon740405 重新編輯於 2008-10-28 12:09:23, 註解 無‧
demon740405 重新編輯於 2008-10-28 12:10:04, 註解 無‧ demon740405 重新編輯於 2008-10-28 12:11:52, 註解 無‧ |
wq236589
一般會員 ![]() ![]() 發表:21 回覆:37 積分:16 註冊:2008-08-27 發送簡訊給我 |
|
demon740405
一般會員 ![]() ![]() 發表:6 回覆:10 積分:3 註冊:2005-12-10 發送簡訊給我 |
|
wq236589
一般會員 ![]() ![]() 發表:21 回覆:37 積分:16 註冊:2008-08-27 發送簡訊給我 |
不固定也行
var i:integer; t,s,y:string; begin for i:= 1 to length([78:06:32]46684531) do if t='[' then s:=s copy([78:06:32]46684531,i,1); if t=']' then y:=y copy([78:06:32]46684531,i,1); if (copy([78:06:32]46684531,i,1) = '[') or (copy([78:06:32]46684531,i,1) = ']') then t:=copy([78:06:32]46684531,i,1) ; end s就等于78:06:32 y等于46684531 方法比较笨但是很实用 ![]() |
jow
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
TESTDATA.TXT 的內容:
[78:06:32]46684531 [32:15:65][55:87:01][11:59:88][01:07:67]355579841 [code delphi] procedure TForm1.Button2Click(Sender: TObject); var L,M: TStringList; S: string; I: Integer; begin if FileExists('D:\TESTDATA.TXT') then begin M := TStringList.Create; try M.LoadFromFile('D:\TESTDATA.TXT'); L := TStringList.Create; try L.Delimiter := ']'; L.DelimitedText := M.Text; S := ''; M.Text := ''; for I := L.Count-1 downto 0 do begin L[I] := Trim(L[I]); if L[I][1] = '[' then M.Insert(0,L[I] ']' S) else S := L[I]; end; finally FreeAndNil(L); end; M.SaveToFile('D:\RESULE.TXT'); ShowMessage(M.Text); finally FreeAndNil(M); end; end; end; [/code]
編輯記錄
jow 重新編輯於 2008-10-28 15:58:24, 註解 無‧
|
wq236589
一般會員 ![]() ![]() 發表:21 回覆:37 積分:16 註冊:2008-08-27 發送簡訊給我 |
|
demon740405
一般會員 ![]() ![]() 發表:6 回覆:10 積分:3 註冊:2005-12-10 發送簡訊給我 |
請問jow大大:
那麼假如後面的資料有空白的怎麼辦呢? 因為我後來發現有很多資料是有空白的 但又不能夠刪掉(因為要保留原始資料) 就以以上的例子來說: 46684531的資料 可能是4668 4531 (8和4中間有個空白) 我剛測試了您的程式碼後 發現只要出現了空白 後面的資料都會被刪了 (4531不見了) 請問是因為trim的原因嗎? ===================引 用 jow 文 章=================== TESTDATA.TXT 的內容: [78:06:32]46684531 [32:15:65][55:87:01][11:59:88][01:07:67]355579841 [code delphi] procedure TForm1.Button2Click(Sender: TObject); var L,M: TStringList; S: string; I: Integer; begin if FileExists('D:\TESTDATA.TXT') then begin M := TStringList.Create; try M.LoadFromFile('D:\TESTDATA.TXT'); L := TStringList.Create; try L.Delimiter := ']'; L.DelimitedText := M.Text; S := ''; M.Text := ''; for I := L.Count-1 downto 0 do begin L[I] := Trim(L[I]); if L[I][1] = '[' then M.Insert(0,L[I] ']' S) else S := L[I]; end; finally FreeAndNil(L); end; M.SaveToFile('D:\RESULE.TXT'); ShowMessage(M.Text); finally FreeAndNil(M); end; end; end; [/code]
------
** 何須劍道爭鋒? 千人指,萬人封; 可問江湖鼎峰? 三尺秋水塵不染, 天 下 無 雙 **
編輯記錄
demon740405 重新編輯於 2008-10-28 17:40:12, 註解 無‧
|
st33chen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
您好,
我覺得我的想法比較不一樣, 就是用 tstringlist 來切資料 var mylist, mylist2 : tstringlist; mylist.loadfromfile('brabrabra.txt'); for ii := 0 to mylist.count-1 do begin mylist2.text := stringreplace(stringreplace(mylist.strings[ii],'[','',[rfreplaceall]),']',#13,[rfreplaceall]); kk := mylist2.count-1; for jj := 0 to kk-1 do begin showmessage(mylist2.strings[jj] ' ' mylist2.strings[kk]); // 您自己變化看要如何存或印. end; end; 參考一下. ==================================================== brabrabra.txt 的內容 : [78:06:32]46684531 [32:15:65][55:87:01][11:59:88][01:07:67]355579841
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲. |
st33chen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
另外一個想法是
先把 [78:06:32]46684531 [32:15:65][55:87:01][11:59:88][01:07:67]355579841 改成 [78:06:32]46684531 [32:15:65]355579841[55:87:01]355579841[11:59:88]355579841[01:07:67]355579841 資料格式一致了, 其餘的您應該會處理了吧 以下是每讀入一列(假設放在 astr)後 astr := stringreplace(astr,'][',']' copy(astr,LastDelimiter(']',astr) 1,length(astr)) '[',[rfreplaceall]); 不過, 還是覺得我的上一個方法最簡潔. 參考一下.
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-10-29 10:09:00, 註解 無‧
|
pceyes
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
不敢說最好,但最懶
[code delphi]sl2: Tstringlist.create; // 暫存文件 sl := Tstringlist.create; // 完整文件 sl.loadfromfile('data.txt'); //讀檔 // 逐筆做 for ii :=0 to sl.count-1 do begin if pos('][',sl[ii])>0 then begin // 含有一個以上的時段 sl2.text:=StringReplace(sl[ii],'[','',[rfReplaceAll]); //清空 [ sl2.text:=StringReplace(sl[ii],']',#13 #10,[rfReplaceAll]); // ] 轉 換行 s := sl2[sl2.count-1]; // 最後一筆一定是資料段 for iii:=0 to sl2.count-2 do begin // 注意是倒數第二筆 ComboBox1.items.add(sl2[iii]); ComboBox2.items.add(s); end; end else begin // 僅有一個時段 (簡單) sl2.text:=StringReplace(sl[ii],'[','',[rfReplaceAll]); //清空 [ sl2.text:=StringReplace(sl[ii],']',#13 #10,[rfReplaceAll]); // ] 轉 換行 ComboBox1.items.add(sl2[0]); ComboBox2.items.add(sl2[1]); end; end; [/code]
------
努力會更接近成功 |
demon740405
一般會員 ![]() ![]() 發表:6 回覆:10 積分:3 註冊:2005-12-10 發送簡訊給我 |
嗯嗯~~謝謝各位前輩
jow st33chen pceyes 三位大大的東西都寫的很好 有點不知道怎麼給分 ![]() 傷腦筋~
------
** 何須劍道爭鋒? 千人指,萬人封; 可問江湖鼎峰? 三尺秋水塵不染, 天 下 無 雙 **
編輯記錄
demon740405 重新編輯於 2008-10-29 15:50:32, 註解 無‧
|
benshaoxw
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2008-11-05 發送簡訊給我 |
var
i:integer; t,s,y:string; begin for i:= 1 to length([78:06:32]46684531) do if t='[' then s:=s copy([78:06:32]46684531,i,1); if t=']' then y:=y copy([78:06:32]46684531,i,1); if (copy([78:06:32]46684531,i,1) = '[') or (copy([78:06:32]46684531,i,1) = ']') then t:=copy([78:06:32]46684531,i,1) ; end
------
我就是我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |