我的文本文件大小约为6MB。有些行包含我想删除的NULL(Chr(0))字符。 我有两种方法可以做到这一点:使用Asc()= 0但这需要大约50秒才能完成,另一种方法使用InStr(line,Chr(0))= 0(快〜4秒),但结果会删除重要信息包含NULL字符的行。
第一行文本文件为例:
@@MMCIBN.000NULL7NULL076059NULL7653NULL1375686349NULL2528NULL780608NULL10700NULL\NULL_NC_ACT.DIR\CFG_RESET.INI
第一种方法(工作但非常慢)
function normalise (textFile )
Set fso = CreateObject("Scripting.FileSystemObject")
writeTo = fso.BuildPath(tempFolder, saveTo & ("\Output.arc"))
Set objOutFile = fso.CreateTextFile(writeTo)
Set objFile = fso.OpenTextFile(textFile,1)
Do Until objFile.AtEndOfStream
strCharacters = objFile.Read(1)
If Asc(strCharacters) = 0 Then
objOutFile.Write ""
nul = true
Else
if nul = true then
objOutFile.Write(VbLf & strCharacters)
else
objOutFile.Write(strCharacters)
end if
nul = false
End If
Loop
objOutFile.close
end function
输出如下:
@@MMCIBN.000
7
076059
7653
1375686349
2528
780608
10700
\
_NC_ACT.DIR\CFG_RESET.INI
第二个方法代码:
filename = WScript.Arguments(0)
Set fso = CreateObject("Scripting.FileSystemObject")
sDate = Year(Now()) & Right("0" & Month(now()), 2) & Right("00" & Day(Now()), 2)
file = fso.BuildPath(fso.GetFile(filename).ParentFolder.Path, saveTo & "Output " & sDate & ".arc")
Set objOutFile = fso.CreateTextFile(file)
Set f = fso.OpenTextFile(filename)
Do Until f.AtEndOfStream
line = f.ReadLine
If (InStr(line, Chr(0)) > 0) Then
line = Left(line, InStr(line, Chr(0)) - 1) & Right(line, InStr(line, Chr(0)) + 1)
end if
objOutFile.WriteLine line
Loop
f.Close
但输出是:
@@MMCIBN.000\CFG_RESET.INI
有人可以指导我如何快速删除NULLS而不会丢失信息。我曾想过尝试使用第二种方法来扫描哪些行号需要更新,然后将其提供给第一种方法以尝试加快速度,但老实说,我不知道在哪里开始这样做! 提前谢谢......
答案 0 :(得分:3)
看起来第一种方法只是用换行符替换每个NULL
。如果这就是你所需要的,你可以这样做:
<强>更新强>
好的,听起来你需要用换行符替换每个 set 的NULL。让我们试试这个:
strText = fso.OpenTextFile(textFile, 1).ReadAll()
With New RegExp
.Pattern = "\x00+"
.Global = True
strText = .Replace(strText, vbCrLf)
End With
objOutFile.Write strText
更新2:
我认为Read/ReadAll
类的TextStream
方法在处理文本和二进制数据的混合时遇到了问题。让我们使用ADO Stream
对象来代替读取数据。
' Read the "text" file using a Stream object...
Const adTypeText = 2
With CreateObject("ADODB.Stream")
.Type = adTypeText
.Open
.LoadFromFile textFile
.Charset = "us-ascii"
strText = .ReadText()
End With
' Now do our regex replacement...
With New RegExp
.Pattern = "\x00+"
.Global = True
strText = .Replace(strText, vbCrLf)
End With
' Now write using a standard TextStream...
With fso.CreateTextFile(file)
.Write strText
.Close
End With
答案 1 :(得分:1)
我尝试使用此方法(update2)来读取MS-Access锁定文件(空字符在64字节记录中终止字符串),并且ADODB.Stream不想打开已在使用的文件。所以我将那部分改为:
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFile(Lfile)
z = f.Size
set ts = f.OpenAsTextStream(ForReading, 0) 'TristateFalse
strLog = ts.Read(z)
ts.Close
set f = nothing
' replace 00 with spaces
With New RegExp
.Pattern = "\x00+"
.Global = True
strLog = .Replace(strLog, " ")
End With
' read MS-Access computername and username
for r = 1 to len(strLog) step 64
fnd = trim(mid(strLog,r, 32)) & ", " & trim(mid(strLog,r+32, 32)) & vbCrLf
strRpt = strRpt & fnd
next