替换大型 txt 文件上的文本函数值输入不起作用

Replacing text function value input on large txt file not work

expiration.txt 文件包含 197.015 行。

foo1; 2020-03-01 13:33;
foo2; 2020-02-01 08:45;
foo3; 2020-01-01 11:30;
...
...
...

在这个大的 txt 文件上,我需要替换所有日期值:

  1. 2020-03-01 13:332020-03-01
  2. 2020-02-01 08:452020-02-01
  3. 2020-01-01 11:302020-01-01
  4. ...
  5. ...
  6. 2018-01-01 12:402018-01-01 (这是最后的行号 197.015)

我试过下面的代码。

没有错误,但 txt 文件中的替换输入不起作用。

新的expiration.txt文件保持不变。

如何解决这个问题?

Const ForReading = 1
Const ForWriting = 2
intCount = 0
intIndex = 1
Set oFSO = CreateObject("Scripting.FileSystemObject")
str_input = ""
Set oInFile = oFSO.OpenTextFile("expiration.txt", 1)
str_input = oInFile.ReadAll()
Set oRegEx = CreateObject("VBScript.RegExp")
With oRegEx
    .Multiline = True
    .Global = True
    .Pattern = "(\d+)-(\d+)-(\d+)\s(\d+):(\d+):(\d+);"
End With
Do Until oInFile.AtEndOfStream
str_input = oInFile.ReadLine
If (intCount = 0) Then
   str_input = oRegEx.Replace(str_input, "--;")
   Set oInFile = oFSO.OpenTextFile("expiration.txt", 2)
   oInFile.Write str_input
   oInFile.Close
End If
intCount = intCount + 1
If (intCount = 200) Then
    intCount = 0
    intIndex = intIndex + 1
    oInFile.Close
End If
Loop
oInFile.Close
set oFSO = nothing
WScript.echo "ok"

尝试从大型输入文件中读取每一行,处理该行,然后一次一行地将其写入新的输出文件。如有必要,您可以删除原始输入文件,并在脚本末尾重命名新的输出文件(经过验证)。

我发现您当前脚本的一些问题:

  • 它同时调用了 ReadAll()ReadLine(),这是不必要的。
  • 它不会在再次打开同一个文件 ForWriting 之前为原始 ForReading 文件句柄调用 Close
  • intCount 为 0(零)时,它仅尝试翻译输入文件的第一行(以及随后的每第 200 行)。
  • 正则表达式需要列出秒数,但您的示例 YYYY-MM-DD hh:mm; 日期时间数据不包含秒数,因此正则表达式不匹配。

我不确定 intCount = 200 块的目的是什么,所以我从我的回答中省略了它。无论如何,我保留了行计数器 intCount 变量不变,以防你以后想使用它。

这是一个可能的解决方法...

Option Explicit

Const ForReading = 1

Dim oRegEx : Set oRegEx = New RegExp
oRegEx.Multiline = True
oRegEx.Global = True
oRegEx.Pattern = "(\d+)-(\d+)-(\d+)\s(\d+):(\d+);"

Dim intCount : intCount = 0
Dim str_input : str_input = ""
Dim oFSO : Set oFSO = CreateObject("Scripting.FileSystemObject")
Dim oInFile : Set oInFile = oFSO.OpenTextFile("expiration.txt", ForReading)
Dim oOutFile : Set oOutFile = oFSO.CreateTextFile("expiration~2.txt", True)
Do Until oInFile.AtEndOfStream
    str_input = oInFile.ReadLine()

    If oRegEx.Test(str_input) Then
        oOutFile.WriteLine oRegEx.Replace(str_input, "--;")
    Else
        oOutFile.WriteLine str_input
    End If

    intCount = intCount + 1
Loop

oOutFile.Close
oInFile.Close

Set oOutFile = Nothing
Set oInFile = Nothing

' If necessary, use oFSO to delete the original expiration.txt file here, and rename expiration~2.txt to expiration.txt

Set oFSO = Nothing
Set oRegEx = Nothing

WScript.Echo "Ok"

希望对您有所帮助。