Regex 有没有一种方法可以在不使用正则表达式的情况下从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" 并在重

我有一个excel文件,它从一个外部的.exe文件运行一个模型,并收集其输出以存储在各种图纸上进行数据分析

.exe文件以可访问的基于文本的格式保存其输入文件。我意识到我可以通过直接从vba编辑输入文件并在循环中运行来创建批处理运行,但是它需要从vba在.txt或.xml文件中查找和替换。我需要使用通配符作为字符串的一部分,我想找到的字符串每次都会改变,并且在第一次迭代时是不可预测的。例如:

我想在基于文本的文件中查找以下文本:

"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自学的,是一名机械工程师,不是程序员),也没有时间在这个例子中学习——我计划在发现这个问题之前的几个小时内实现它。你的第二个建议很可能会奏效。明天早上我会检查它的固定宽度。