替换大型 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 文件上,我需要替换所有日期值:
- 2020-03-01 13:33 至 2020-03-01
- 2020-02-01 08:45 至 2020-02-01
- 2020-01-01 11:30 至 2020-01-01
- ...
- ...
- 2018-01-01 12:40 到 2018-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"
希望对您有所帮助。
expiration.txt 文件包含 197.015 行。
foo1; 2020-03-01 13:33;
foo2; 2020-02-01 08:45;
foo3; 2020-01-01 11:30;
...
...
...
在这个大的 txt 文件上,我需要替换所有日期值:
- 2020-03-01 13:33 至 2020-03-01
- 2020-02-01 08:45 至 2020-02-01
- 2020-01-01 11:30 至 2020-01-01
- ...
- ...
- 2018-01-01 12:40 到 2018-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"
希望对您有所帮助。