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

如何读入行数据

答題得分者是:jow
nimo
一般會員


發表:5
回覆:9
積分:2
註冊:2007-11-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-19 12:31:57 IP:219.142.xxx.xxx 訂閱
各位大侠,

问题:txt文件数据按行排列,如何将此txt文件读入,并转换成所需要的结果?

hh01:
ROW
a0
1b
abc
3a3
1hh1:
ROW
2a
b3
a3b
3h4h:
ROW
4a
6b4
436
8dr
h4h5:
ROW
5b
8cc
d9d
8ab
8h9h33:
ROW
2ab
3ac

我希望得到如下文件样式:
hh01 a0
hh01 1b
hh01 abc
hh01 3a3
1hh1 2a
1hh1 b3
1hh1 a3b
3h4h 4a
3h4h 6b4
3h4h 436
3h4h 8dr
h4h5 5b
h4h5 8cc
h4h5 d9d
h4h5 8ab
8h9h33 2ab
8h9h33 3ac


谢谢Jow的帮助!
附加檔案:474111bd3ccd5_source.txt
編輯記錄
nimo 重新編輯於 2007-11-19 23:31:27, 註解 無‧
nimo 重新編輯於 2007-11-19 23:32:57, 註解 無‧
jow
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-19 13:13:39 IP:210.66.xxx.xxx 訂閱
處理字串問題, 建議多多練習TStrings如何使用




[code delphi]
//-----------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
I: Integer;
H: string;
L, M: TStringList;
begin
if FileExists('D:\INPUT.TXT') then
begin
L := TStringList.Create;
try
L.LoadFromFile('D:\INPUT.TXT');
M := TStringList.Create;
try
for I := 0 to L.Count-1 do
if (Pos('h',L[I])>0)and (Pos(':',L[I])>0) then H := L[I]
else if (H <> '') and (L[I]<>'ROW') then M.Add(H #$20 L[I]);
//OUTPUT
if M.Count > 0 then
begin
ListBox1.Items.Text := M.Text; //顯示結果
M.SaveToFile('D:\OUTPUT.TXT'); //儲存結果
end;

finally
FreeAndNil(M);
end;
finally
FreeAndNil(L);
end;
end;
end;
//-----------------------------------------------------------------------------
[/code]

執行結果(D:\OUTPUT.TXT)
hh01: a0
hh01: 1b
hh01: abc
hh01: 3a3
1hh1: 2a
1hh1: b3
1hh1: a3b
3h4h: 4a
3h4h: 6b4
3h4h: 436
3h4h: 8dr
h4h5: 5b
h4h5: 8cc
h4h5: d9d
h4h5: 8ab
8h9h33: 2ab
8h9h33: 3ac


nimo
一般會員


發表:5
回覆:9
積分:2
註冊:2007-11-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-19 14:59:10 IP:219.142.xxx.xxx 訂閱
Jow,

谢谢您的指点!

您的脚本需要一点细微的改动,才能得到所希望的结果,改动如下:
else if (H <> '') and (L[I]<>'ROW') then M.Add(H #$20 L[I]);
应该改为
else if (L[I] <> '') and (L[I]<>'ROW') then M.Add(H #$20 L[I]);

再次表示衷心的感谢!
編輯記錄
nimo 重新編輯於 2007-11-19 15:00:55, 註解 無‧
jow
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-19 15:12:39 IP:210.66.xxx.xxx 訂閱
如果第一個 String 不含'h' 及 ':' 該怎麼處理???

===================引 用 nimo 文 章===================
Jow,

谢谢您的指点!

您的脚本需要一点细微的改动,才能得到所希望的结果,改动如下:
else if (H <> '') and (L[I]<>'ROW') then M.Add(H #$20 L[I]);
应该改为
else if (L[I] <> '') and (L[I]<>'ROW') then M.Add(H #$20 L[I]);

再次表示衷心的感谢!
編輯記錄
jow 重新編輯於 2007-11-19 23:09:01, 註解 無‧
jow
尊榮會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-19 23:37:04 IP:123.193.xxx.xxx 訂閱
將輸入資料檔函式化, 讓處理動作流程更清楚
顯示於ListBox1的內容是非必要的, 純粹是Trace
程式用途.......



[code delphi]
//------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
L: TStringList;
I: Integer;
begin
L := nil;//初始化物件
if ProcessInput('D:\INPUT.TXT', L) then
try
ListBox1.Items.Text := L.Text;//顯示回傳結果
for I := 0 to L.Count-1 do
begin
//Do some thing
end;
finally
FreeAndNil(L);
end;
end;
//------------------------------------------------------------------------------
function TForm1.ProcessInput(const FileName: string; var ret: TStringList): Boolean;
var
I: Integer;
H, S: string;
L: TStringList;
begin
if Assigned(ret) then FreeAndNil(ret);
ret := TStringList.Create;//產生回傳的TStringList;

if FileExists(FileName) then
begin
L := TStringList.Create;
try
L.LoadFromFile(FileName);
for I := 0 to L.Count-1 do
begin
S := Trim(L[I]);
if S = '' then Continue
else if (Pos('h',S)>0) and (Pos(':',S)>0) then H := Copy(S,1,Length(S)-1)
else if (H <> '') and (S <> 'ROW') then ret.Add(H #$20 S);
end;
finally
FreeAndNil(L);
end;
end;
Result := ret.Count > 0;
end;
[/code]
系統時間:2024-05-06 8:24:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!