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

时间:2018-08-23 16:00:58

标签: vbscript

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

到目前为止,我已经写了这篇文章:

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

1 个答案:

答案 0 :(得分:0)

您的代码已经看起来不错,但是我认为在这里您必须逐行浏览文件并检查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

说明

For i = 0 to uBound(lines)循环中,第一件事是检查该行是否实际具有字符串值*MD*。 对此的测试是

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

了解有关Instr()

的信息

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

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

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

了解有关Mid()

的信息

由于您的评论,我认为可能有whitespace个字符,例如空格,制表符或换行符围绕您想要的值,因此我在其周围放了一个Trim()以消除这些字符。

了解有关Trim()

的信息

提醒您:number只是一个STRING值,但这就是您要测试的值,因此我们使用以下方法测试此字符串的长度是否大于9:

If Len(number) > 9 Then

查找Len()

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

希望有帮助。

p.s。我不隶属于w3schools,但是对于VBScript初学者来说,这是一个获取信息的好地方。