Set Stm =CreateObject("ADODB.Stream")
Stm.Type=2 '2-文本模式,1-二进制模式
Stm.Mode=3 '3-读写,1-读,2-写
Stm.CharSet= "gb2312" 'Unicode,utf-8,ASCII,gb2312,big5,gbk
Stm.Open
Stm.LoadFromFile "1.txt"
str = Stm.ReadText
Stm.Close
Set Stm=Nothing
使用 ADODB.Stream 打开文件,读了全部内容就关闭。这里容易产生的BUG就是文件如果过大,会导致内存爆掉。
------------------
For i = 1 To Len(str)
ascstr = ascstr & "," & CStr(Asc(Mid(str, i, 1)))
j = right(ascstr,len(ascstr)-1)
Next
'MsgBox j
Set f = fso.OpenTextFile("ASCII代码.txt",ForAppend, True)
f.Write j
f.Close
预处理读到的内容,然后保存到一个文件,等等,为什么这步要保存?? 这里保存文件使用的是 FSO 。另外是追加模式,如果第一次运行时生成的文件没删掉时,再运行第二次那文件里会有第二份内容啊。
Set openFile=fso.OpenTextFile("ASCII代码.txt",1,True) '1表示只读,2表示可写,8表示追加,True表示目标文件存在时是否覆盖
AsciiStr = openFile.ReadAll
openFile.Close
重新读上一行保存的文件。等等,为什么这步要重新读,不可以直接用上步生成的字符串吗?
还有,这里读取使用的是 FSO ,为什么不用第一步的 ADODB.Stream ,兼程序不够复杂吗?
到这步,内存里已存在 三份副本。
1、原始文件:str
2、预处理后的内容:j
3、重新读取后的内容:Asciistr
----------------
S=split(AsciiStr,",") '以空格作为分隔符
For i=0 to ubound(S)
if i+1 <= ubound(S) then '防止下标越界
if S(i)<0 and S(i+1)>=0 then '加入空格的时机,条件
SaveFiles(Chr(S(i)))
SaveFiles(" ")
else
SaveFiles(Chr(S(i)))
end if
else
SaveFiles(Chr(S(i)))
end if
Next
处理,然后每处理一个字符,就直接写入文件。
每次写一个字符时,就会触发一次写盘操作,极大的影响效率和磁盘的寿命,如果是 固态硬盘的话,按你文件字符数进行磨损块次数。
为什么不直接在上一次直接得到ascii数组
只需要几句代码
程序代码:
redim S(len(str) '重定义数组大小
For i = 1 To Len(str)
s(i)=Asc(Mid(str, i, 1)) '保存ASCII码
Next
=====================
总结:
1、程序是拼凑起来的。不同部分甚至使用了不同的组件。
2、对程序的优化没任何经验。程序优化有二个方向,内存优化和速度优化。
对于处理文件不能确定大小时,有可能出现超大文件时,考虑的是内存优化,这种情况下是读文件的部分容进行进行处理的。
对于处理文件能确定不会超大时,这时考虑的是速度优化,文件就是一次性读入内容。
根据你的代码能正常运行,说明你文件不会超大,可以使用速度优化,按行处理好了,为啥硬要分解成每一个字符来处理呢,拖延运行速度。
[此贴子已经被作者于2021-7-27 13:41编辑过]