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

如何合并文件中的指定列

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-17 02:10:23 IP:221.218.xxx.xxx 訂閱
初学者所碰到的问题,希望能够得到大侠们的指点。

问题:我有多个同种格式的文本文件,第四列的文件只要不含字符r,其所在的行字符就为空。我只需要其中的某几列,即只要是第三列中(r所出现的位置不规则)包含字符串'r',就需要保留,不含r的列所在的行在合并到新文件中会被删除。我希望从窗体的下拉菜单中同时选择所有的文件进行合并(也可能只选择两个文件、三个文件等,即可以任意选择合并文件数量),合并的结果保存在一个文件中。如何实现呢?

文本文件分别为1.txt, 2.txt, 3.txt(希望能够从下拉菜单选择,并且可以任意两个或两个以上文件组合)(见附件)

1.txt文件:
A0 01 1r a0
A1 02 2r9 a21
A2 03 none
B3 04 4r01 3a4
B4 05 r51 5aa
C0 10 60r a7b
C1 19 no
C2 21 7r7 aa
C3 04 no
C4 05 no

2.txt文件:
D0 01 11r b0
D1 02 r22 1bb
D2 03 none
D3 04 14r2 3c
D4 05 5r1r 3bc
E0 10 6rr 4cc
E1 19 no
E2 21 none
E3 04 r7r11 5a
E4 05 no
3.txt文件:
F0 11 r11 de
F1 22 2r28r dae
F2 13 none
F3 34 92r aa
F4 15 31r21 db
G0 10 r5r ee
G1 19 no
E2 31 none
E3 14 1r34r cde
E4 25 none


希望得到的结果:从下拉菜单选择所需要合并的三个文档,只保留后面包含字符“r”所对应的源文件第三列及对应的第一列,并将生成的最终结果保存在result.txt文件中。
结果文件:result.txt


A0 01 1r a0
A1 02 2r9 a21
B3 04 4r01 3a4
B4 05 r51 5aa
C0 10 60r a7b
C2 21 7r7 aa
D0 01 11r b0
D1 02 r22 1bb
D3 04 14r2 3c
D4 05 5r1r 3bc
E0 10 6rr 4cc
E3 04 r7r11 5a
F0 11 r11 de
F1 22 2r28r dae
F3 34 92r aa
F4 15 31r21 db
G0 10 r5r ee
E3 14 1r34r cde
非常希望得到各位大侠的帮助!

谢谢!
編輯記錄
nimo 重新編輯於 2007-11-17 02:14:01, 註解 無‧
nimo 重新編輯於 2007-11-17 02:14:17, 註解 無‧
nimo 重新編輯於 2007-11-17 02:23:00, 註解 無‧
nimo 重新編輯於 2007-11-18 08:37:33, 註解 無‧
nimo 重新編輯於 2007-11-18 08:47:06, 註解 無‧
nimo 重新編輯於 2007-11-19 02:00:59, 註解 無‧
jow
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-17 09:41:17 IP:123.193.xxx.xxx 訂閱


[code delphi]
//------------------------------------------------------------------------------
function TForm1.split(S: string; var X: TStringList): Boolean;
var
I: Integer;
begin
if not Assigned(X) then X := TStringList.Create;
X.Text := StringReplace(S,#32,#13,[rfReplaceAll,rfIgnoreCase]);
//去除空白列
for I := X.Count-1 downto 0 do
if Trim(X[I]) = '' then X.Delete(I);
Result := X <> nil;
end;
//------------------------------------------------------------------------------
[/code]


[code delphi]
//------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
S: string;
begin
for I := 1 to 7 do
begin
S := '';
if I and $01 > 0 then S := S '1.txt,';
if I and $02 > 0 then S := S '2.txt,';
if I and $04 > 0 then S := S '3.txt,';
S[Length(S)] := #$20;
ComboBox1.Items.Add(Trim(S));
end;
ComboBox1.ItemIndex := 0;
end;
//------------------------------------------------------------------------------
[/code]


[code delphi]
//------------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
S: string;
I, J: Integer;
fn, ret,F, T: TStringList;
begin
ret := TStringList.Create;
try
fn := TStringList.Create;
try
fn.CommaText := ComboBox1.Items[ComboBox1.ItemIndex];
if fn.Count > 0 then
begin
for I := 0 to fn.Count-1 do
if FileExists('D:\' fn[I]) then
begin
F := TStringList.Create;
try
F.LoadFromFile('D:\' fn[I]);
for J := 0 to F.Count-1 do
begin
S := Trim(F[J]);
if(S[Length(S)]='r')and
(split(S, T)) and
(T.Count = 3) then
begin
ret.Add(T[0] #$8 T[1]);
T.Text := '';
end;
end;
finally
FreeAndNil(F);
end;
end;
end;
finally
FreeAndNil(fn);
end;

//顯示結果
ListBox1.Items.Text := ret.Text;

finally
FreeAndNil(ret);
end;
end;
//------------------------------------------------------------------------------
[/code]

新增: 將結果儲存到檔案中

//顯示結果
ret.SaveToFile('D:\RESULT.TXT');
ListBox1.Items.Text := ret.Text;

測試碼下載:
http://delphi.ktop.com.tw/download.php?download=upload/473e851423560_Test026.zip
編輯記錄
jow 重新編輯於 2007-11-17 10:41:28, 註解 無‧
jow 重新編輯於 2007-11-17 14:08:57, 註解 無‧
nimo
一般會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-17 18:23:57 IP:221.222.xxx.xxx 訂閱
joe,

非常感谢您的帮助!

按照这个程式运行,当我有更多的同种格式TEXT文件需要合并时,如4.txt, 5.txt, 6.txt, 7.txt......等等,每次我得更改程序,才能实现。

我的问题是:能否通过任意选择的方式来合并文档,就像Windows中使用ctrl键选择文件一样(所编写程式是固定的)?同时,只要是第三列包含r字符,不论在什么位置,都会合并到result.txt中,如23r2, 2r24, r12, 23r等,都满足条件,都应当进行整合,并出现在result.txt文档中。

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


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-18 17:08:36 IP:123.193.xxx.xxx 訂閱
修改原上傳程式中Button2Click()裡的判斷條件即可,

另外如果需要合併不定檔案數的資料,
那又牽扯到UI動作的設計,
(1)建置所有資料的檔案清單
(2)選擇要合併的檔案清單
(3)處理並輸出到RESULT.TXT

範例中主要說明資料的處理, 在ComboBox中的檔案清單
與選擇的動作,只是因應範例程式的需要而寫的, 無法滿足
你所要的需求....

這部分請自行實作...

如何抓取某個目錄中的檔案, 你可以參考這一篇:
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=90839



以下是修改後的程式碼:

[code delphi]
//------------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
S: string;
I, J: Integer;
fn, ret,F, T: TStringList;
begin
ret := TStringList.Create;
try
fn := TStringList.Create;
try
fn.CommaText := ComboBox1.Items[ComboBox1.ItemIndex];
if fn.Count > 0 then
begin
for I := 0 to fn.Count-1 do
if FileExists('D:\' fn[I]) then
begin
F := TStringList.Create;
try
F.LoadFromFile('D:\' fn[I]);
for J := 0 to F.Count-1 do
begin
S := Trim(F[J]);


//修改的部分
if(split(S, T)) and
(T.Count = 4) and
(Pos('r',T[2])>0) then
begin
ret.Add(F[J]);//將原字串輸出
T.Text := '';
end;



end;
finally
FreeAndNil(F);
end;
end;
end;
finally
FreeAndNil(fn);
end;
//顯示結果
ret.SaveToFile('D:\RESULT.TXT');
ListBox1.Items.Text := ret.Text;
finally
FreeAndNil(ret);
end;
end;
//------------------------------------------------------------------------------

[/code]

執行結果:
A0 01 1r a0
A1 02 2r9 a21
B3 04 4r01 3a4
B4 05 r51 5aa
C0 10 60r a7b
C2 21 7r7 aa
D0 01 11r b0
D1 02 r22 1bb
D3 04 14r2 3c
D4 05 5r1r 3bc
E0 10 6rr 4cc
E3 04 r7r11 5a
F0 11 r11 de
F1 22 2r28r dae
F3 34 92r aa
F4 15 31r21 db
G0 10 r5r ee
E3 14 1r34r cde


問題的規格, 不要在改了......


2007-11-21
新增動作: 開啟個別檔案, 以供處理
[code delphi]

function TForm1.GetFileName(var ret: string): Boolean;
var
OldPath: string;
od: TOpenDialog;
begin
ret := '';
OldPath := GetCurrentDir;
try
od := TOpenDialog.Create(Self);//Self 代表TForm1
try
od.InitialDir := 'D:\temp';
Result := od.Execute and FileExists(od.FileName);
if Result then ret := od.FileName;
finally
FreeAndNil(od);
end;
finally
SetCurrentDir(OldPath);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
fn: string;
begin
if GetFileName(fn) then
Label1.Caption := fn
else Label1.Caption := '';
end;

[/code]
編輯記錄
jow 重新編輯於 2007-11-21 19:29:26, 註解 無‧
nimo
一般會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-18 17:26:19 IP:222.129.xxx.xxx 訂閱
Joe,

非常感谢!

从您这里,我学到了许多,作为初学者,非常高兴能够在这个论坛里得到像您一样这么多大师和高手的指点,使我受益匪浅。让我对delphi编程的认识有了一个全新的理解。

非常高兴来到这个论坛,来这里短短几天,通过您的耐心指点,我觉得自己有了一定程度的提高,在今后的学习中,希望能够继续得到像您这样的大侠的指点和帮助!

再次表示衷心的感谢!

系統時間:2024-05-06 6:07:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!