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

如何取出字串資料

答題得分者是:pceyes
demon740405
一般會員


發表:6
回覆:10
積分:3
註冊:2005-12-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-28 11:54:34 IP:59.114.xxx.xxx 訂閱
我有數筆資料,它的資料格式如下:
[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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-28 13:27:03 IP:123.181.xxx.xxx 訂閱
如果括号中的字符串长度是固定的话可以用copy
copy([78:06:32]46684531),2,8)
这个就是78:06:32
copy([78:06:32]46684531,11,length(([78:06:32]46684531))
这个是46684531。
demon740405
一般會員


發表:6
回覆:10
積分:3
註冊:2005-12-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-28 13:57:41 IP:59.114.xxx.xxx 訂閱
可是我的資料不只是這樣
每一筆資料的括號量是不固定的
上述的只是其中的兩筆資料
其他的資料有些是一筆裡頭就有4個括號
有的甚至有5個
但你的寫法看起來似乎是固定的 已經知道資料>"<
------
**
何須劍道爭鋒?
千人指,萬人封;
可問江湖鼎峰?
三尺秋水塵不染,
天 下 無 雙
**
wq236589
一般會員


發表:21
回覆:37
積分:16
註冊:2008-08-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-28 15:52:58 IP:124.237.xxx.xxx 訂閱
不固定也行


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
方法比较笨但是很实用

編輯記錄
wq236589 重新編輯於 2008-10-28 15:54:15, 註解 無‧
wq236589 重新編輯於 2008-10-28 15:57:50, 註解 無‧
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-28 15:56:59 IP:203.73.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-28 16:15:16 IP:124.237.xxx.xxx 訂閱
我写的有点错误
会多出一个']'
最好再置换一下
s:=StringReplace(s,‘]','',[rfReplaceAll]);
demon740405
一般會員


發表:6
回覆:10
積分:3
註冊:2005-12-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-28 17:39:30 IP:59.114.xxx.xxx 訂閱
請問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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-28 17:54:15 IP:122.116.xxx.xxx 未訂閱
您好,
我覺得我的想法比較不一樣, 就是用 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 重新編輯於 2008-10-28 17:56:26, 註解 無‧
st33chen 重新編輯於 2008-10-29 09:47:01, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-10-29 10:05:39 IP:122.116.xxx.xxx 未訂閱
另外一個想法是
先把
[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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-10-29 11:37:17 IP:124.199.xxx.xxx 訂閱
不敢說最好,但最懶

[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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-10-29 15:49:38 IP:59.114.xxx.xxx 訂閱
嗯嗯~~謝謝各位前輩
jow
st33chen
pceyes

三位大大的東西都寫的很好
有點不知道怎麼給分
傷腦筋~
------
**
何須劍道爭鋒?
千人指,萬人封;
可問江湖鼎峰?
三尺秋水塵不染,
天 下 無 雙
**
編輯記錄
demon740405 重新編輯於 2008-10-29 15:50:32, 註解 無‧
benshaoxw
一般會員


發表:1
回覆:6
積分:1
註冊:2008-11-05

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-11-05 10:56:55 IP:121.234.xxx.xxx 訂閱
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
------
我就是我
系統時間:2024-05-06 7:57:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!