Vbscript 从平面文件中提取特定子字符串后的数字

Vbscript 从平面文件中提取特定子字符串后的数字,vbscript,Vbscript,我需要为平面文件编写一个VB脚本实用程序来查找字符串MD*。如果找到MD*,则查找MD*旁边的数字长度,如果数字长度大于10,则将MD*替换为XXXXXX* 到目前为止,我已经写了以下内容: Dim index,str str = "MD*" index = InStr(str, "MD*") + 1 Const ForReading = 1 Const ForWriting = 2 Set objFSO = CreateObject("Scripting.FileSystemObject")

我需要为平面文件编写一个VB脚本实用程序来查找字符串
MD*
。如果找到
MD*
,则查找
MD*
旁边的数字长度,如果数字长度大于10,则将
MD*
替换为
XXXXXX*

到目前为止,我已经写了以下内容:

Dim index,str
str = "MD*"
index = InStr(str, "MD*") + 1
Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Users\Test\test.txt", ForReading)

strText = objFile.ReadAll
objFile.Close
If Len(InStr("MD*") + 1) > 9 Then
    strText = Replace(strText, "MD*", "XXXX*")
End If

Set objFile = objFSO.OpenTextFile("C:\Users\Test\test.txt", ForWriting)
objFile.WriteLine strText

objFile.Close
文件中的示例数据:

NM1*IL*1*GOTODS*NEOL*X***MD*70238 NM1*IL*1*GOTODS*DAVID****MD*19446836789 NM1*IL*1*GOTODS*NEOL*X***MD*70238 NM1*IL*1*GOTODS*DAVID****MD*19446836789
您的代码看起来已经很好了,但我认为您必须逐行检查文件并检查
MD*
字段。 查看示例数据,我认为最好检查
*MD*
,以确保其他字段均以“MD”结尾

试试这个:

Option Explicit

Const ForReading = 1
Const ForWriting = 2

Dim objFSO, objFile, strText, lines, i, md, number

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Users\Test\test.txt", ForReading)

' read all text
strText = objFile.ReadAll
' split it into an array of lines on Newline (vbCrLf)
lines = Split(strText, vbCrLf)
objFile.Close

'loop through each line to see if in contains the string "*MD*"
For i = 0 to uBound(lines)
    md = InStr(1, lines(i), "*MD*", vbBinaryCompare )  'use vbTextCompare for case insensitive search
    If md > 0 Then
        number = Trim(Mid(lines(i), md + 4))
        If Len(number) > 9 Then
            'update this line
            lines(i) = Replace(lines(i),"*MD*","*XXXX*")
        End If
    End If
Next

'now write the updated array back to file
'set a different filename here so as not to overwrite your original source file
Set objFile = objFSO.OpenTextFile("C:\Users\Test\test_updated.txt", ForWriting)
For i = 0 to uBound(lines)
    objFile.WriteLine lines(i)
Next
objFile.Close

'clean up objects used
Set objFile = Nothing
Set objFSO  = Nothing

解释

在i=0 to uBound(lines)循环的
中,首先要做的是检查该行是否实际具有字符串值
*MD*
。 这方面的测试是

md = InStr(1, lines(i), "*MD*", vbBinaryCompare)
了解

如果测试成功,变量
md
将大于0,因此接下来我们尝试获取
*md*
字符串右侧的值。 由于变量
md
保持字符串(第(i)行)中的起始位置,因此我们只需向该变量添加4(长度
*md*
)即可获得后面值的起始位置

根据您的示例,该行中的值后面没有任何内容,因此我们可以使用
MID()
函数来检索它,从位置
md+4
开始,不指定结束位置,这样它将获得该行中剩余的所有内容。 然后,该值将被捕获到名为
number
的变量中,因为它始终表示一个带有以下内容的数值:

number = Trim(Mid(lines(i), md + 4))
了解

由于您的评论,我推测可能会有
空格
字符,如空格、制表符或换行符围绕您想要的值,因此我在其周围放置了
Trim()
,以消除这些字符

了解

请注意:
number
只是一个字符串值,但这正是您想要测试的,因此我们使用以下方法测试此字符串的长度是否大于9:

If Len(number) > 9 Then
仰望

如果是这种情况,请将行中的
*MD*
替换为
*XXXX*
,然后继续下一行,直到完成

希望有帮助


p、 我不是w3schools的会员,但对于VBScript初学者来说,这是一个获取信息的好地方。

您使用的是vb.net还是VBScript?这是非常不同的事情。到目前为止你有什么?我们可以从文件中获得一组具有预期输出的数据样本吗?请分享一些样本数据和您期望的输出。此外,在这里您可能会遇到一些阻力,因为一般认为您已经编写了一些代码,但与“编写一个程序来执行XYZ”相反,它有一个特殊的问题。这可能很简单,但是有人会快速地制定一个常规。你有很多事情要做。试着把你的问题分成几个小问题。你能打开一个文件吗。你能从文件中读取数据吗。你能用字符串搜索吗。你能把数字串起来吗。你能数一数字符串的长度吗。你能做搜索/替换吗。你能在文件里写吗。所有这些都是独立的问题。我正在使用vbscript,我有以下几个小步骤来改进这个问题,并防止它被搁置,你能解释一下你在代码中遇到的具体问题吗?太棒了,非常感谢你给出了一个漂亮的解决方案。谢谢你。我一生中的第一篇帖子,在很短的时间内得到了非常好的回复。感谢@Theo使用到目前为止,我已经意识到它正在替换长度小于或等于9的MD。请帮助。@user10265736奇怪,对我来说,它工作正常。您确定输入在最后一个(数字)字段之后不包含任何内容吗?可能有一个空格或额外的换行符。要克服这个问题,请将
number=Mid(行(i),md+4)
更改为
number=Trim(行(i,md+4))
。非常感谢更新的逻辑。我可以知道这些行的含义是什么:修剪(中间(行(I),md+4)),如果Len(数)>9,则行(I)=替换(行(I),“MI”,“XXXX”)???再次感谢您的帮助。@user10265736我在答案中添加了很多解释。希望有帮助。