經常有人在詢問如何快速將文本文檔中的“,”批量替換為Tab制表符,以方便將文本文檔快速導入datawindow中。
大多數PB程序員都是建議使用fileopen、fileread(9及以前版本。10及以後版本用filereadex)的方法讀入,然後再自己寫個函數進行字符串的replace 。這種方法未嘗不可,只是效率太低。
下面給出一種使用ole進行處理的方法,該方法集成在如下全局函數f_txt_replace (string as_file, string as_search, string as_replace)中。
[cpp]
global function long f_txt_replace
(string as_file, string as_search, string as_replace);
string ls
int li
oleObject ADODB,ScrCtl
//(1)打開並讀取文件
ADODB = CREATE OLEObject
if ADODB.ConnectToNewObject("ADODB.Stream") <> 0 then
messagebox('', '無法連接【ADODB.Stream】!')
return -1
end if
ADODB.Type = 1 //二進制數據Binary
ADODB.Mode =3 //具有讀/寫權限
ADODB.Open()
ADODB.LoadFromFile(as_file)
ADODB.Position = 0 //Position為0才能設置Charset
ADODB.Type = 1 //blob數據
ls = string(ADODB.Read() )
//(2)替換文本內容
ScrCtl = create oleobject
if ScrCtl.connecttonewobject("MSScriptControl.ScriptControl") <> 0 then
messagebox('', '無法連接【MSScriptControl.ScriptControl】!')
return -1
end if
ScrCtl.Language = "JavaScript"
ScrCtl.Eval("function clrn(str){return str.replace(/" + as_search + "/g,'" + as_replace + "')}")
ls = string(ScrCtl.CodeObject.clrn(ls))
destroy ScrCtl
//(3)保存並關閉文件
ADODB.Position = 0
ADODB.write(blob(ls))
//保存為文本文件
ADODB.SaveToFile( as_file, 2)
//清空緩沖區數據
ADODB.flush()
//關閉流
ADODB.Close()
destroy ADODB
return len(ls)
end function
調用方法如下:
[cpp]
long ll_size
ll_size = f_txt_replace('e:\a.txt', ',', '~t') //將半角逗號, 替換為制表符
messagebox('替換後文件大小', ll_size)
至於效率如何,大家自己試試吧
摘自 yyoinge的專欄