2014-08-28 199 views
2

我拥有大小约为6MB的文本文件。有一些行包含我想删除的NULL(Chr(0))字符。 我有两种方法来做到这一点:使用Asc()= 0,但这大约需要50s完成,另一种方法使用InStr(行,Chr(0))= 0(快约4秒),但结果删除重要信息包含NULL字符的行。使用vbs从文本文件中删除nul字符

文本文件作为例子的第一行:

@@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 

是否有人可以指导我如何快速去除空值,而不会丢失信息。我曾尝试使用第二种方法来扫描哪些行号需要更新,然后将其提供给第一种方法来尝试加快速度,但老实说,我不知道哪里可以开始做这件事! 在此先感谢...

+0

您试过['Replace()'](http://msdn.microsoft.com/en-us/library/238kz954(v = vs.84).aspx )? – 2014-08-28 18:14:45

+0

感谢您的回复。是的,脚本没有输出,但具有较高的CPU和内存使用率,就是这样。 – BertB 2014-08-28 18:39:40

回答

3

它看起来像第一种方法是用换行符替换每个NULL。如果这是你所需要的,你可以这样做:

更新时间:

OK,听起来像是你需要更换每个设置的NULL以换行符。让我们试试这个:

strText = fso.OpenTextFile(textFile, 1).ReadAll() 

With New RegExp 
    .Pattern = "\x00+" 
    .Global = True 
    strText = .Replace(strText, vbCrLf) 
End With 

objOutFile.Write strText 

更新2:

我觉得TextStream类的Read/ReadAll方法具有处理文本和二进制数据的混合麻烦。我们用一个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 
+0

第一种方法检查字符,如果我正确地理解方法(我涉及到软件,而不是一个职业:-))NULL被替换为“”,如果前一个字符是*真实*然后它给VBCrLf一个新的行,否则将继续在同一行(我遗漏了空字符和清晰度的NULL长字符串)我试过这个替换方法,但没有输出从脚本根本高CPU使用率和高内存使用情况,这就是它。感谢您的帮助到目前为止... – BertB 2014-08-28 18:34:58

+0

我明白了。我更新了我的答案,以查找NULL的_sets_而不是用换行符替换每个实例。看看是否有帮助。 – Bond 2014-08-28 19:03:50

+0

第一行不完整,下一行显示实际行111412!我试过的代码如下:'textFile = WScript.Arguments(0)' 'Set fso = CreateObject(“Scripting.FileSystemObject”)' 'writeTo = fso.BuildPath(fso.GetFile(textFile) .ParentFolder.Path,saveTo& “Output.arc”)'' 设置objOutFile = fso.CreateTextFile(的writeTo)'' = strText中fso.OpenTextFile(文本文件,1).ReadAll()' '随着新RegExp' '.Pattern = “\ X00 +”' 。全球=真 strText中= .Replace(strText中,vbCrLf) 完随着 objOutFile.Write strText' – BertB 2014-08-28 19:32:29

1

我试图用于读取MS-访问锁定文件这种方法(UPDATE2)(空字符终止于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