VBS Readline - 使用instr()来匹配数据,同时忽略额外的空格

时间:2013-12-31 18:25:59

标签: vbscript readline

我正试图找到一种方法来增强脚本的可靠性。它已经可以工作,但可以在导入的文本文件中使用简单的额外空间来抛弃它。

所以我想把我的脚本改成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"

我现在使用的是什么: 我用notepad ++编辑文本文件到FIND&将“\ 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"

问题:如果文本文件的创建者在此行中的任何位置放置了另一个空格“在线路的RB或西部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行,然后遍历文本文件。

3 个答案:

答案 0 :(得分:1)

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

使用这些假设,你可以创建一个像这样的笨重的函数,它寻找fullstops,并将它们转换为空格,删除额外的空格。显然,这很大程度上依赖于你的输入源文件不会改变太多 - 你真的应该正在使用正则表达式正确地处理这些东西。

您可以使用以下功能测试基本预期结果。 例如,假设您在firLine中设置了一行文本,其中包含多个空格或fullstops,该函数将识别出这一点:

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

答案 1 :(得分:0)

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

但是,首先,您应该按照您的规范进行操作。用简单的单词和一些样本描述您认为(不)匹配的内容。

例如:一个包含“FLIGHTS”,“OVER”和“TUSKY”字样的字符串,其间至少有一个空格是匹配 - “飞越TUSKY”,“飞越TUSKY”; “在托斯卡纳上空飞行”是一次“近乎未命中” - 那么“飞越TUSKY”会怎样?

答案 2 :(得分:0)

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

以下是“Entries1.txt”

的摘录

BRADD KANNI的飞行请文件:
威盛J174.RIFLE..ACK..DIRECT
 或RBV.J62.ACK..DIRECT
    飞往KANNI WHALE的飞行请查询:
VIA J174.RIFLE..ACK..DIRECT或
    飞机上的飞行请文件:“
ETC,ETC

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