如何將.Txt檔案中所有的 '#0' 替換為'#20'? |
答題得分者是:ha0009
|
mathewzhao
中階會員 發表:121 回覆:164 積分:67 註冊:2003-04-04 發送簡訊給我 |
|
hagar
版主 發表:143 回覆:4056 積分:4445 註冊:2002-04-14 發送簡訊給我 |
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 發送簡訊給我 |
你好:
這個程式你試試吧 < 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 發送簡訊給我 |
( 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 發送簡訊給我 |
|
ha0009
版主 發表:16 回覆:507 積分:639 註冊:2002-03-16 發送簡訊給我 |
你好:
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 發送簡訊給我 |
引言: 你好: 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 發送簡訊給我 |
引言: 晚輩愚駑,估計原因是因為: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 發送簡訊給我 |
你好:
不充一下喔,其實 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 發送簡訊給我 |
引言: 你好: 不充一下喔,其實 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 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
引言: 你好: 哇< > 被 > 藍色的部分的確是主要的關鍵點,紅色的部分是則是處理換行的迴圈< > 也謝謝 >哈哈!我可真是不想去看 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 發送簡訊給我 |
感謝三位前輩的指點!
引言: 應該是 mathewzhao 問題的誤導吧,一般來說 .txt 是純文字檔,應該不會有 #0 這樣的東西,如果有,就不是純文字檔。 如果是純文字檔,而改變的資料是純文字的資料如 #50 改成 #60 ,那上述的所有方法都適用,但是如果要處理 #0 就不應該用純文字的方法來處理,以 TStringList 來說,在 SaveToFile 時,每一行會自動加上 #13 #10 ,如果不是純文字檔,那檔案大小可能就改變了。這個.txt檔是用程式從.xls轉換出來的(不是用Excel中File/Save as..),轉換後資料是完整的,但是在每行的field 之間都是#0,所以有此問題。 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |