所以,我找到了以下脚本来修改文本文件,但是为了我的目的而无法调整它。
Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
If InStr(strLine,"ex3")> 0 Then
strLine = Replace(strLine,"ex3","ex5")
End If
WScript.Echo strLine
Loop
我有一个plc程序,我正在转换并需要将B3 [3] .5转换为B3 [43],但值会发生变化。基本上,原始文本是B3 [x] .y,我需要B3 [z],其中z =(16 * x)+ y。我可以使用" B3 ["作为我的搜索参数,但不知道如何操纵单词的尾部。
整个程序中有数百个这样的实例,脚本是修改它的最快方法。
这是文本文件的示例。您可以看到B3的值有所不同。括号中的数字可以是0到60之间的任何数字,句点之后的数字只能是0到15。
ROUTINE _3_INFEED ()
N: XIC(I[3].2) OTE(O[23].15);
N: XIC(B3[12].9) TON(T4[0], ?, ?);
N: [ XIC(I[16].0) [ XIO(O[22].0) XIO(O[22].1) , XIC(B3[12].9) ] , XIC(B3[12].10) XIC(O[22].1) XIC(I[16].0) ] OTE(B3[12].9);
N: XIC(I[16].0) ONS(B3[10].7) XIC(O[22].1) OTU(B3[12].10);
N: XIO(I[16].0) ONS(B3[10].10) XIC(O[22].0) OTL(B3[12].10);
N: XIO(I[16].7) [ XIO(I[16].9) , XIC(B3[14].13) ] [ XIC(B3[12].10) , XIO(I[16].7) , XIC(O[22].1) , XIC(B3[12].11) ] OTE(B3[12].11);
N: XIO(I[16].7) ONS(B3[10].8) XIC(O[22].0) OTU(B3[12].10);
N: XIC(I[16].7) ONS(B3[10].9) XIC(O[22].1) OTL(B3[12].10);
N: [ XIC(I[18].3) [ XIC(B3[12].9) XIC(T4[0].DN) , XIC(B3[12].10) ] XIO(B3[12].11) , XIC(I[18].6) [ XIO(I[16].9) XIC(B3[12].11) XIO(B3[14].13) , XIC(B3[7].0) ] XIC(T4[2].DN) XIC(I[16].1) XIC(O[22].3) ] OTE(B3[7].0);
N: XIO(I[16].9) TOF(T4[2], ?, ?);
N: [ [ XIC(I[18].3) XIC(I[66].4) XIC(B3[7].0) , XIO(I[18].3) XIC(I[18].4) ] [ XIC(T4[2].DN) XIC(I[16].1) XIC(O[22].3) , XIC(I[16].7) ] , XIO(I[66].4) XIC(I[66].6) XIC(I[16].1) ] [ OTE(O[66].6) , OTE(O[22].0) ];
N: [ XIO(I[18].3) XIC(I[18].5) , XIO(I[66].4) XIC(I[66].5) ] [ OTE(O[66].5) , OTE(O[22].1) ];
答案 0 :(得分:0)
Dim x
Dim y
Dim templine
Dim objFile
Dim objFS
Dim strLine As String
objFS = CreateObject("Scripting.FileSystemObject")
objFile = objFS.OpenTextFile("c:\test\file.txt")
Do Until objFile.AtEndOfStream
strLine = objFile.ReadLine
If InStr(strLine, "B3[") > 0 Then
templine = strLine
'find x
'find y
'x = Mid(strLine,Instr(strLine,"[",Instr(strLine,"]"))
'fixed
templine = Mid(templine, InStr(templine, "B3[") + 3)
x = sLeft(templine, InStr(templine, "]") - 1)
templine = Mid(templine, InStr(templine, "]") + 2)
y = sLeft(templine, InStr(templine, ")") - 1)
templine = Mid(templine, InStr(templine, ")") + 1)
strLine = Replace(strLine, "B3[" & x & "]." & y, "B3[" & CStr((16 * x) + y) + "]")
End If
Loop
答案 1 :(得分:0)
这样的问题应该用正则表达式(找到要更改的部分及其组件)及其替换函数(进行计算和替换)来解决。演示:
Option Explicit
Function f(sm, sx, sy, np, ss) ' match, group1, ..., pos, source
f = "B[" & (16 * CLng(sx) + CLng(sy)) & "]"
End Function
Dim r : Set r = New RegExp
r.Pattern = "B3\[(\d+)\]\.(\d+)"
Dim s : s = "whateverB3[3].5dontcare"
WScript.Echo s, r.Replace(s, GetRef("f"))
输出:
cscript 30874914.vbs
whateverB3[3].5dontcare whateverB[53]dontcare
对于理论/背景,请启动here。
更新迈克尔的InStr()策略:
虽然你可以使用像
这样的东西Dim p : p = InStr(s, "B3[")
Dim x : x = CLng(Mid(s, p + 3, InStr(s,"]") - p - 3))
WScript.Echo x
通过InStr()得到第一个数字,你不能指定第二个数字的结束位置;你需要一个RegExp来利用"数字/字符串数字"的概念。
更新已公布的数据:
(从文件中读取数据并全局应用替换)
Option Explicit
Function f(sm, sx, sy, np, ss) ' match, group1, ..., pos, source
f = "B[" & (16 * CLng(sx) + CLng(sy)) & "]"
End Function
Dim r : Set r = New RegExp
r.Global = True
r.Pattern = "B3\[(\d+)\]\.(\d+)"
Dim s : s = CreateObject("Scripting.FileSystemObject").OpenTextFile("30874914.txt").ReadAll()
WScript.Echo s
WScript.Echo "---------------"
WScript.Echo r.Replace(s, GetRef("f"))
输出:
cscript 30874914.vbs
ROUTINE _3_INFEED ()
N: XIC(I[3].2) OTE(O[23].15);
N: XIC(B3[12].9) TON(T4[0], ?, ?);
N: [ XIC(I[16].0) [ XIO(O[22].0) XIO(O[22].1) , XIC(B3[12].9) ] , XIC(B3[12].10) XIC(O[22].1) XIC(I[16].0) ]
OTE(B3[12].9);
N: XIC(I[16].0) ONS(B3[10].7) XIC(O[22].1) OTU(B3[12].10);
N: XIO(I[16].0) ONS(B3[10].10) XIC(O[22].0) OTL(B3[12].10);
N: XIO(I[16].7) [ XIO(I[16].9) , XIC(B3[14].13) ] [ XIC(B3[12].10) , XIO(I[16].7) , XIC(O[22].1) , XIC(B3[12]
.11) ] OTE(B3[12].11);
N: XIO(I[16].7) ONS(B3[10].8) XIC(O[22].0) OTU(B3[12].10);
N: XIC(I[16].7) ONS(B3[10].9) XIC(O[22].1) OTL(B3[12].10);
N: [ XIC(I[18].3) [ XIC(B3[12].9) XIC(T4[0].DN) , XIC(B3[12].10) ] XIO(B3[12].11) , XIC(I[18].6) [ XIO(I[16].
9) XIC(B3[12].11) XIO(B3[14].13) , XIC(B3[7].0) ] XIC(T4[2].DN) XIC(I[16].1) XIC(O[22].3) ] OTE(B3[7].0);
N: XIO(I[16].9) TOF(T4[2], ?, ?);
N: [ [ XIC(I[18].3) XIC(I[66].4) XIC(B3[7].0) , XIO(I[18].3) XIC(I[18].4) ] [ XIC(T4[2].DN) XIC(I[16].1) XIC(
O[22].3) , XIC(I[16].7) ] , XIO(I[66].4) XIC(I[66].6) XIC(I[16].1) ] [ OTE(O[66].6) , OTE(O[22].0) ];
N: [ XIO(I[18].3) XIC(I[18].5) , XIO(I[66].4) XIC(I[66].5) ] [ OTE(O[66].5) , OTE(O[22].1) ];
---------------
ROUTINE _3_INFEED ()
N: XIC(I[3].2) OTE(O[23].15);
N: XIC(B[201]) TON(T4[0], ?, ?);
N: [ XIC(I[16].0) [ XIO(O[22].0) XIO(O[22].1) , XIC(B[201]) ] , XIC(B[202]) XIC(O[22].1) XIC(I[16].0) ] OTE(B
[201]);
N: XIC(I[16].0) ONS(B[167]) XIC(O[22].1) OTU(B[202]);
N: XIO(I[16].0) ONS(B[170]) XIC(O[22].0) OTL(B[202]);
N: XIO(I[16].7) [ XIO(I[16].9) , XIC(B[237]) ] [ XIC(B[202]) , XIO(I[16].7) , XIC(O[22].1) , XIC(B[203]) ] OT
E(B[203]);
N: XIO(I[16].7) ONS(B[168]) XIC(O[22].0) OTU(B[202]);
N: XIC(I[16].7) ONS(B[169]) XIC(O[22].1) OTL(B[202]);
N: [ XIC(I[18].3) [ XIC(B[201]) XIC(T4[0].DN) , XIC(B[202]) ] XIO(B[203]) , XIC(I[18].6) [ XIO(I[16].9) XIC(B
[203]) XIO(B[237]) , XIC(B[112]) ] XIC(T4[2].DN) XIC(I[16].1) XIC(O[22].3) ] OTE(B[112]);
N: XIO(I[16].9) TOF(T4[2], ?, ?);
N: [ [ XIC(I[18].3) XIC(I[66].4) XIC(B[112]) , XIO(I[18].3) XIC(I[18].4) ] [ XIC(T4[2].DN) XIC(I[16].1) XIC(O
[22].3) , XIC(I[16].7) ] , XIO(I[66].4) XIC(I[66].6) XIC(I[16].1) ] [ OTE(O[66].6) , OTE(O[22].0) ];
N: [ XIO(I[18].3) XIC(I[18].5) , XIO(I[66].4) XIC(I[66].5) ] [ OTE(O[66].5) , OTE(O[22].1) ];