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

如何將.Txt檔案中所有的 '#0' 替換為'#20'?

答題得分者是:ha0009
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-26 09:13:25 IP:61.150.xxx.xxx 未訂閱
各位先進好! Q: 如何將.Txt檔案中所有的 '#0' 替換為'#20',謝謝!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-26 09:22:19 IP:202.39.xxx.xxx 未訂閱
var sl: TStringList;
  sTmp: string;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile('C:\xx.txt');
    sTmp := sl.Text;
    sl.Text := StringReplace(sTmp, #0, #20, [rfReplaceAll]);
    sl.SaveToFile('C:\xx.txt');
  finally
    sl.Free;
  end;
end;
--- 每個人都是一本書
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-26 09:33:04 IP:61.30.xxx.xxx 未訂閱
你好: 這個程式你試試吧 < class="code"> procedure ChangeFileChar (FileName : String; Src, Dest : Char); var S : TMemoryStream; i : integer; Ptr : PChar; begin if not FileExists (FileName) then system.exit; S := TMemoryStream.Create; try S.LoadFromFile (FileName); ptr := S.Memory; for i := 0 to S.Size - 1 do begin if Ptr^ = Src then Ptr^ := Dest; Inc (Ptr); end; S.SaveToFile (FileName); finally FreeAndNil (s); end; end;
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-26 09:36:28 IP:61.224.xxx.xxx 未訂閱
( dllee 之 Delphi 亂寫  ) < class="code"> procedure Change0to20(SourceFile: String; TargetFile: String); var stm: TMemoryStream; i: integer; begin stm := TMemoryStream.Create; try stm.LoadFromFile(SourceFile); for i:=0 to stm.Size do begin if( PCHAR(stm.Memory)[i] = #0) then PCHAR(stm.Memory)[i]:=#20; end; stm.SaveToFile(TargetFile); finally stm.Free; end; end; 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-26 11:20:20 IP:61.150.xxx.xxx 未訂閱
感謝3位前輩的指點! 經晚輩實際驗證: ha0009和dllee兩位前輩的方法是可行的; hagar前輩所示方法在轉換完後,只有第一個#0以前的資料。 晚輩愚駑,估計原因是因為:TStringList與TMemoryStream的在碰到#0時處理的差別, sl.LoadFromFile('C:\xx‧txt'); 只讀出了第一個#0前的部分,所以沒有進行轉換。 希望各位先進給予指點,謝謝!
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-26 11:36:59 IP:61.30.xxx.xxx 未訂閱
你好: hagar 前輩的問題可能是因為他將字串帶入 sTmp 中,因此才會發生字串截斷的問題。 所以一般在處理 binary 的資料時都是以指標來處理,如果確定是純文字的話才以字串的方 式處理。這是弟的看法,請各位先進指導 < class="code"> var sl: TStringList; sTmp: string; begin sl := TStringList.Create; try sl.LoadFromFile('C:\xx.txt'); sTmp := sl.Text; sl.Text := StringReplace(sTmp, #0, #20, [rfReplaceAll]); sl.SaveToFile('C:\xx.txt'); finally sl.Free; end; end;
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-26 11:57:15 IP:202.39.xxx.xxx 未訂閱
引言: 你好: hagar 前輩的問題可能是因為他將字串帶入 sTmp 中,因此才會發生字串截斷的問題。 所以一般在處理 binary 的資料時都是以指標來處理,如果確定是純文字的話才以字串的方 式處理。這是弟的看法,請各位先進指導 < class="code"> var sl: TStringList; sTmp: string; begin sl := TStringList.Create; try sl.LoadFromFile('C:\xx.txt'); sTmp := sl.Text; sl.Text := StringReplace(sTmp, #0, #20, [rfReplaceAll]); sl.SaveToFile('C:\xx.txt'); finally sl.Free; end; end;
嘿嘿! 不要叫小弟前輩啦! 還真難為情哩! 感謝 ha0009 與 mathewzhao 的指正. --- 每個人都是一本書< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=9549643&CC=213577">
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-26 12:11:29 IP:61.231.xxx.xxx 未訂閱
引言: 晚輩愚駑,估計原因是因為:TStringList與TMemoryStream的在碰到#0時處理的差別, sl.LoadFromFile('C:\xx‧txt'); 只讀出了第一個#0前的部分,所以沒有進行轉換。 希望各位先進給予指點,謝謝!
您答對了 >沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-26 12:41:18 IP:61.30.xxx.xxx 未訂閱
你好: 不充一下喔,其實 TStringList 在 LoadFromFile 的程序中載入的方式與 TMemoryStream 的方式是一樣的,都是利用 TFileStream 取得檔案的內容。但因為 TStringList 在取得檔案內容時有呼叫 SetTextStr 程序,以至於無法完整的取出檔案的內容。這樣說明應該更加清楚了 < class="code"> procedure TStrings.SetTextStr(const Value: string); var P, Start: PChar; S: string; begin BeginUpdate; try Clear; P := Pointer(Value); if P <> nil then while P^ <> #0 do begin Start := P; while not (P^ in [#0, #10, #13]) do Inc(P); SetString(S, Start, P - Start); Add(S); if P^ = #13 then Inc(P); if P^ = #10 then Inc(P); end; finally EndUpdate; end; end;
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-06-26 13:41:31 IP:61.231.xxx.xxx 未訂閱
引言: 你好: 不充一下喔,其實 TStringList 在 LoadFromFile 的程序中載入的方式與 TMemoryStream 的方式是一樣的,都是利用 TFileStream 取得檔案的內容。但因為 TStringList 在取得檔案內容時有呼叫 SetTextStr 程序,以至於無法完整的取出檔案的內容。這樣說明應該更加清楚了 < class="code"> procedure TStrings.SetTextStr(const Value: string); var P, Start: PChar; S: string; begin BeginUpdate; try Clear; P := Pointer(Value); if P <> nil then while P^ <> #0 do begin Start := P; while not (P^ in [#0, #10, #13]) do Inc(P); SetString(S, Start, P - Start); Add(S); if P^ = #13 then Inc(P); if P^ = #10 then Inc(P); end; finally EndUpdate; end; end;
不能讀完全部的內容,主要是藍色的判斷式。 應該是 mathewzhao 問題的誤導吧,一般來說 .txt 是純文字檔,應該不會有 #0 這樣的東西,如果有,就不是純文字檔。 如果是純文字檔,而改變的資料是純文字的資料如 #50 改成 #60 ,那上述的所有方法都適用,但是如果要處理 #0 就不應該用純文字的方法來處理,以 TStringList 來說,在 SaveToFile 時,每一行會自動加上 #13 #10 ,如果不是純文字檔,那檔案大小可能就改變了。 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
ha0009
版主


發表:16
回覆:507
積分:639
註冊:2002-03-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-06-26 13:57:40 IP:61.30.xxx.xxx 未訂閱
你好: 哇< > 被 > 藍色的部分的確是主要的關鍵點,紅色的部分是則是處理換行的迴圈< > 也謝謝 >
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-06-26 14:33:04 IP:61.231.xxx.xxx 未訂閱
引言: 你好: 哇< > 被 > 藍色的部分的確是主要的關鍵點,紅色的部分是則是處理換行的迴圈< > 也謝謝 >
哈哈!我可真是不想去看 VCL 的原始碼,除非萬不得以... 因為實在有太多的 Delphi 語法不懂... 我一直想要測試 >沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
mathewzhao
中階會員


發表:121
回覆:164
積分:67
註冊:2003-04-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-06-26 18:54:05 IP:61.150.xxx.xxx 未訂閱
感謝三位前輩的指點!   
引言: 應該是 mathewzhao 問題的誤導吧,一般來說 .txt 是純文字檔,應該不會有 #0 這樣的東西,如果有,就不是純文字檔。 如果是純文字檔,而改變的資料是純文字的資料如 #50 改成 #60 ,那上述的所有方法都適用,但是如果要處理 #0 就不應該用純文字的方法來處理,以 TStringList 來說,在 SaveToFile 時,每一行會自動加上 #13 #10 ,如果不是純文字檔,那檔案大小可能就改變了。
這個.txt檔是用程式從.xls轉換出來的(不是用Excel中File/Save as..),轉換後資料是完整的,但是在每行的field 之間都是#0,所以有此問題。
系統時間:2024-05-02 11:27:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!