【问题标题】:VBS Readline - using instr(), to match data whilst ignoring extra spacesVBS Readline - 使用 instr() 来匹配数据,同时忽略多余的空格
【发布时间】:2023-03-24 14:00:02
【问题描述】:

我正在努力寻找一种方法来提高我的脚本的可靠性。它已经可以使用,但可以在导入的文本文件中使用一个简单的额外空间将其丢弃。

因此,如果我能找到一种方法来执行以下操作,我想将我的脚本更改为 Readline:

.txt 文件中的文本示例:

    FLIGHTS OVER  TUSKY  PLEASE FILE: 
        AT OR WEST OF A LINE   RBV..LLUND..BAYYS..PUT..DIRECT
    FLIGHTS OVER EBONY PLEASE FILE:
        AT OR WEST OF A LINE   RBV..LLUND..BAYYS..PUT..DIRECT

我知道以下内容不起作用,但如果有一个简单的修改,那就太好了。

set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("C:\Downloads\software\putty.exe -load "testing")

set objFSO = CreateObject("Scripting.FileSystemObject") 
set objFile = objFSO.OpenTextFile("C:\Users\AW\Desktop\Entries1.txt") 

strLine = objFile.ReadAll

If InStr(strLine1, "OVER  TUSKY  PLEASE") and InStr(strLine2, "BAYYS..PUT..DIRECT") Then
    trans307="TUSKY"
    ind306="4"

我现在使用的是什么: 我在记事本++中编辑文本文件,用“”查找和替换“\n”,用“”替换“\r”,然后它都是一个文本字符串,我在该字符串中搜索字符串。

If InStr(strLine, "FLIGHTS OVER  TUSKY  PLEASE FILE: AT OR WEST OF A LINE      ..RBV..LLUND..BAYYS..PUT..DIRECT") _
or InStr(strLine, "FLIGHTS OVER  TUSKY  PLEASE FILE: AT OR WEST OF A LINE      RBV..LLUND..BAYYS..PUT...DIRECT") Then
    trans308C="TUSKY"
    ind308C="4"

问题:如果文本文件的创建者在“AT OR WEST OF A LINE RBV..LLUND..BAYYS..PUT..DIRECT”这一行的任意位置放置另一个空格“”,则脚本将无法识别该字符串。在上面的例子中,我不得不创建另一个或 InStr(strLine, "") 带有额外空格或几个点的语句。

更新: 我会尝试类似:

set objFSO = CreateObject("Scripting.FileSystemObject") 
set objFile = objFSO.OpenTextFile("C:\Users\AW\Desktop\Entries1.txt") 

strLine1 = objFile.Readline(1)
strLine2 = objFile.Readline(2)

If InStr(strLine1, "FLIGHTS OVER  TUSKY") and InStr(strLine2, "RBV..LLUND..BAYYS..PUT..DIRECT") Then
    trans1="TUSKY"
    ind1="4"

看看我能否让它一次读取 2 行,然后循环遍历文本文件。

【问题讨论】:

    标签: vbscript readline


    【解决方案1】:

    如果您害怕正则表达式并寻找替代方法,您可以创建一个笨重的函数来添加到您的脚本中。根据您的样本,句号似乎也从不通常用于正常目的,并且往往代表空格。 (我建议改用正则表达式!)

    使用这些假设,您可以创建一个像这样的笨重函数,它会查找句号,并将它们转换为空格,删除多余的空格。显然,这在很大程度上依赖于您的输入源文件不会发生太大变化 - 您真的应该正在使用正则表达式来正确解决这些问题。

    您可以使用类似下面的函数来测试基本的预期结果。 例如,假设您在 firLine 中设置了一行带有多个空格或句号的文本,该函数会识别:

    firLine = "THIS.IS.A.TEST..YOU...SEE      MULTIPLE SPACES"
    if instr(sanitize(firLine),"THIS IS A TEST YOU SEE MULTIPLE SPACES") then
           wscript.echo "Found it"
    End If
    

    这是您可以在脚本末尾粘贴的笨重函数:

    Function sanitize(srStr)
        Dim preSanitize, srC, spaceMarker
        preSanitize = ""
    
        for srC = 1 to len(srStr)
            if mid(srStr, srC, 1) = "." then 
                preSanitize = preSanitize & " "
            else
                preSanitize = preSanitize & mid(srStr, srC, 1)
            End If
    
        spaceMarker = false
        sanitize = ""
    
        for srC = 1 to len(preSanitize)
            If mid(preSanitize, srC, 1) = " " then
                if spaceMarker = false then 
                    sanitize = sanitize & mid(preSanitize, srC, 1)
                    spaceMarker = true          
                End If
            else
                sanitize = sanitize & mid(preSanitize, srC, 1)
                spaceMarker = false
            End If
        Next
    
    
    End Function
    

    【讨论】:

    • 非常好!我还没有机会测试它,但它看起来正是我想要的。我对 RegEx 并不熟悉,也不是开发人员,而是一名试图学习足够多的 VBS 以避免每天浪费 25 分钟的运维人员。感谢您的输入。
    • 通过文本文件猜测,你所做的相当清楚:) 让他们在空中!但说真的,当你有时间的时候,去看看吧。如果有时间,我会发布一些示例;当您第一次看到它时,它确实看起来像胡言乱语。
    【解决方案2】:

    好消息!我终于想出了如何做到这一点。

    这是来自“Entries1.txt”的 sn-p

    布拉德·坎尼上空的航班请提交:
    通过 J174.RIFLE..ACK..DIRECT
    或 RBV.J62.ACK..DIRECT
    飞越 KANNI WHALE 请提交文件:
    通过 J174.RIFLE..ACK..DIRECT 或
    鲸鱼上空飞行请提交:"
    等,等

    set WshShell = WScript.CreateObject("WScript.Shell")
    set objFSO = CreateObject("Scripting.FileSystemObject") 
    set objFile = objFSO.OpenTextFile("C:\Users\AW\Desktop\Entries1.txt") 
    
    Do until objFile.AtEndOfStream
    firLine = objFile.ReadLine
    
    If InStr(firLine, "FLIGHTS OVER  KANNI  WHALE  PLEASE") Then
        secLine = objFile.ReadLine
    If InStr(secLine, "J174.RIFLE..ACK..DIRECT") Then
      'I'm going to change the below once I piece it all together.
        WScript.Echo "works" 
        Else WScript.Echo "Not found"
    
    'cut, paste and modify all my "IF" statements below
    
    End If
    End If
    loop
    

    【讨论】:

      【解决方案3】:

      InStr() 是检查字符串是否包含固定/文字字符串的好工具。为了允许变化,您应该使用正则表达式(参见thisthat)。

      不过,首先,您应该按照自己的规范进行操作。用简单的语言和一些示例描述您认为(不)匹配的内容。

      例如:包含单词“FLIGHTS”、“OVER”和“TUSKY”的字符串,其中至少有一个空格,即为匹配 - “FLIGHTS OVER TUSKY”、“FLIGHTS OVER TUSKY”; “FLIGHTS OVER TUSKANY”是“差点错过”——“AIRFLIGHTS OVER TUSKY”呢?

      【讨论】:

      • 我已经修改了原帖。您上面提到的一点是好的,但在这种情况下并不相关,因为他们只更改“OVER”之后的单词,并且只有某些单词可以更改为(大约 4 个单词左右的选择),所以 TUSKANY不会是一个问题。 **如果我可以缩小需要出现的确切字符串,那么我可以减少可能的错误数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 2018-12-16
      • 1970-01-01
      相关资源
      最近更新 更多