我需要为平面文件编写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
答案 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初学者来说,这是一个获取信息的好地方。