使用vbs从文本文件中删除空字符

时间:2014-08-28 18:08:46

标签: vbscript null

我的文本文件大小约为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而不会丢失信息。我曾想过尝试使用第二种方法来扫描哪些行号需要更新,然后将其提供给第一种方法以尝试加快速度,但老实说,我不知道在哪里开始这样做! 提前谢谢......

2 个答案:

答案 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