Regex 有没有一种方法可以在不使用正则表达式的情况下从VBA中查找并替换.txt或.xml文件?
我有一个excel文件,它从一个外部的.exe文件运行一个模型,并收集其输出以存储在各种图纸上进行数据分析 .exe文件以可访问的基于文本的格式保存其输入文件。我意识到我可以通过直接从vba编辑输入文件并在循环中运行来创建批处理运行,但是它需要从vba在.txt或.xml文件中查找和替换。我需要使用通配符作为字符串的一部分,我想找到的字符串每次都会改变,并且在第一次迭代时是不可预测的。例如: 我想在基于文本的文件中查找以下文本:Regex 有没有一种方法可以在不使用正则表达式的情况下从VBA中查找并替换.txt或.xml文件?,regex,excel,vba,Regex,Excel,Vba,我有一个excel文件,它从一个外部的.exe文件运行一个模型,并收集其输出以存储在各种图纸上进行数据分析 .exe文件以可访问的基于文本的格式保存其输入文件。我意识到我可以通过直接从vba编辑输入文件并在循环中运行来创建批处理运行,但是它需要从vba在.txt或.xml文件中查找和替换。我需要使用通配符作为字符串的一部分,我想找到的字符串每次都会改变,并且在第一次迭代时是不可预测的。例如: 我想在基于文本的文件中查找以下文本: "0.3843 Flow_Rate_Mass kg/s" 并在重
"0.3843 Flow_Rate_Mass kg/s"
并在重新运行脚本以使用新的输入文件求解.exe之前替换该数字,以获得新的流速。但是,数字0.3843可能是第一个实例中的任何内容(格式为“x.xxxx流量\质量kg/s”
),因此我需要使用通配符来查找和替换
在第一次迭代之后,我将在上一次迭代中设置这个值,因此我可以使用已知字符串中的find和replace,而不需要通配符
因此,以下内容应该可以工作,但在第一次迭代时不够灵活:
Dim sBuf As String
Dim sTemp As String
Dim iFileNum As Integer
Dim sFileName As String
sFileName = "C:\filelocation"
iFileNum = FreeFile
Open sFileName For Input As iFileNum
Do Until EOF(iFileNum)
Line Input #iFileNum, sBuf
sTemp = sTemp & sBuf & vbCrLf
Loop
Close iFileNum
sTemp = Replace(sTemp, "0.3843 Flow_Rate_Mass kg/s", "0.5000 Flow_Rate_Mass kg/s")
iFileNum = FreeFile
Open sFileName For Output As iFileNum
Print #iFileNum, sTemp
Close iFileNum
没有正则表达式有什么解决办法吗?正则表达式替换示例可能是
Option Explicit
Public Sub test()
Dim i As Long, tests()
tests = Array("some text here 0.3843 Flow_Rate_Mass kg/s other text", "some text here 0.5000 Flow_Rate_Mass kg/s other text")
For i = LBound(tests) To UBound(tests)
Debug.Print ReplaceMatch(tests(i))
Next
End Sub
Public Function ReplaceMatch(ByVal inputString As String) As String
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
With re
.Global = True
.MultiLine = True
.pattern = "\b[\.0-9]+( Flow_Rate_Mass kg\/s)"
If .test(inputString) Then
ReplaceMatch = .Replace(inputString, "$1")
Else
ReplaceMatch = inputString
End If
End With
End Function
正则表达式解释:
假定该流量值的长度固定的
Instr
示例。请注意,字符串函数确实具有它们可以使用的功能
Option Explicit
Public Sub test()
Dim i As Long, tests()
tests = Array("some text here 0.3843 Flow_Rate_Mass kg/s other text", "some text here 0.5000 Flow_Rate_Mass kg/s other text")
For i = LBound(tests) To UBound(tests)
Debug.Print ReplaceMatch(tests(i))
Next
End Sub
Public Function ReplaceMatch(ByVal inputString As String) As String
Dim pos As Long, fixedLength As Long, length As Long, leftPosition As Long, rightPosition As Long
fixedLength = 6
pos = InStr(inputString, " Flow_Rate_Mass kg/s")
If pos > 0 Then
length = Len(inputString)
leftPosition = pos - fixedLength - 1
rightPosition = length - pos
ReplaceMatch = Left$(inputString, leftPosition) & Right$(inputString, rightPosition)
Else
ReplaceMatch = inputString
End If
End Function
请注意,使用命令行/powershell和现有工具可以更快地完成此任务:
示例,正则表达式有什么问题?太慢?如果您知道流量/质量kg/s始终存在,请使用Instr找到它,返回x个字符数(假设固定宽度),然后从这两个数字中选择左侧和右侧。如果您认为正则表达式可以满足要求,我可以编写它和正则表达式。代码总是可以做正则表达式所做的事情。问题是,你想要多少代码。@QHarr我不知道REGEX(我是用VBA自学的,是一名机械工程师,不是程序员),也没有时间在这个例子中学习——我计划在发现这个问题之前的几个小时内实现它。你的第二个建议很可能会奏效。明天早上我会检查它的固定宽度。