使用脚本修改文本文件

时间:2015-06-16 18:03:55

标签: vbscript

所以,我找到了以下脚本来修改文本文件,但是为了我的目的而无法调整它。

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) ];

2 个答案:

答案 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) ];