如何合并文件中的指定列 |
答題得分者是:jow
|
nimo
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-15 發送簡訊給我 |
初学者所碰到的问题,希望能够得到大侠们的指点。
问题:我有多个同种格式的文本文件,第四列的文件只要不含字符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 非常希望得到各位大侠的帮助! 谢谢! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
[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 |
nimo
一般會員 發表:5 回覆:9 積分:2 註冊:2007-11-15 發送簡訊給我 |
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 發送簡訊給我 |
修改原上傳程式中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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |