Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 用VB脚本对字符串进行数字排序_Sorting_Vbscript_Qtp_Hp Uft - Fatal编程技术网

Sorting 用VB脚本对字符串进行数字排序

Sorting 用VB脚本对字符串进行数字排序,sorting,vbscript,qtp,hp-uft,Sorting,Vbscript,Qtp,Hp Uft,如何使用VB脚本对带有数值的字符串进行排序 下面是表中每一行的字符串: “测试1通过12月2日” “测试3失败” “测试2通过6月4日” “已验证” “测试10通过” “用户已接受” 我希望在排序后得到以下顺序(自然顺序): “测试1通过12月2日” “测试2通过6月4日” “测试3失败” “测试10通过” “用户已接受” “已验证” 到目前为止我已经尝试过的方法 Set oAlist=CreateObject("System.Collections.ArrayList") oAlist.sor

如何使用VB脚本对带有数值的字符串进行排序

下面是表中每一行的字符串:

  • “测试1通过12月2日”
  • “测试3失败”
  • “测试2通过6月4日”
  • “已验证”
  • “测试10通过”
  • “用户已接受”
  • 我希望在排序后得到以下顺序(自然顺序):

  • “测试1通过12月2日”
  • “测试2通过6月4日”
  • “测试3失败”
  • “测试10通过”
  • “用户已接受”
  • “已验证”
  • 到目前为止我已经尝试过的方法

    Set oAlist=CreateObject("System.Collections.ArrayList")
    oAlist.sort
    
    ArrayList
    是根据我不喜欢的ASCII按以下顺序排序的:

  • “测试1通过12月2日”
  • “测试10通过”
  • “测试2通过6月4日”
  • “测试3失败”
  • “用户已接受”
  • “已验证”
  • 我试过这个链接

    我不知道如何在我的例子中使用AppendFormat


    注意:我的给定字符串可以是完全字符串,也可以是带数字的字符串(动态),因此不确定如何使用记录集或AppendFormat,因为我是编程新手。

    您可以再举一个例子

    Sub Sort
        Set rs = CreateObject("ADODB.Recordset")
        If LCase(Arg(1)) = "n" then
        With rs
            .Fields.Append "SortKey", 4 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3)))
                If IsNumeric(Sortkey) = False then
                    Set RE = new Regexp
                    re.Pattern = "[^0-9\.,]"
                    re.global = true
                    re.ignorecase = true
                    Sortkey = re.replace(Sortkey, "")
                End If
                If IsNumeric(Sortkey) = False then
                    Sortkey = 0
                ElseIf Sortkey = "" then
                    Sortkey = 0
                ElseIf IsNull(Sortkey) = true then
                    Sortkey = 0
                End If
                .AddNew
                .Fields("SortKey").value = CSng(SortKey)
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
    
        ElseIf LCase(Arg(1)) = "d" then
        With rs
            .Fields.Append "SortKey", 4 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3)))
                If IsDate(Sortkey) = False then
                    Set RE = new Regexp
                    re.Pattern = "[^0-9\\\-:]"
                    re.global = true
                    re.ignorecase = true
                    Sortkey = re.replace(Sortkey, "")
                End If
                If IsDate(Sortkey) = False then
                    Sortkey = 0
                ElseIf Sortkey = "" then
                    Sortkey = 0
                ElseIf IsNull(Sortkey) = true then
                    Sortkey = 0
                End If
                .AddNew
                .Fields("SortKey").value = CDate(SortKey)
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
    
    
        ElseIf LCase(Arg(1)) = "t" then
        With rs
            .Fields.Append "SortKey", 201, 260 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3)))
                .AddNew
                .Fields("SortKey").value = SortKey
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
        ElseIf LCase(Arg(1)) = "tt" then
        With rs
            .Fields.Append "SortKey", 201, 260 
            .Fields.Append "Txt", 201, 5000 
            .Open
            Do Until Inp.AtEndOfStream
                Lne = Inp.readline
                SortKey = Trim(Mid(Lne, LCase(Arg(3)), LCase(Arg(4)) - LCase(Arg(3))))
                .AddNew
                .Fields("SortKey").value = SortKey
                .Fields("Txt").value = Lne
                .UpDate
            Loop
            If LCase(Arg(2)) = "a" then SortColumn = "SortKey ASC"
            If LCase(Arg(2)) = "d" then SortColumn = "SortKey DESC"
            .Sort = SortColumn
            Do While not .EOF
                Outp.writeline .Fields("Txt").Value
                .MoveNext
            Loop
        End With
        End If
    End Sub
    

    由于您使用的是字符串,因此需要编写一个自定义排序函数来解析字符串中的测试编号


    或者,您可以预处理列表并将数字解析为单独的字段,然后根据该字段进行排序。

    要将中的技术应用于问题(使用而不是RegExp):

    输出:

    cscript 37946075.vbs
    ----- Input:
    Test 1 pass dec 2
    Test 3 fail
    Test 2 pass jun 4
    Verified
    Test 10 pass
    User Accepted
    ----- Expected:
    Test 1 pass dec 2
    Test 2 pass jun 4
    Test 3 fail
    Test 10 pass
    User Accepted
    Verified
    ----- Output:
    Test 1 pass dec 2
    Test 2 pass jun 4
    Test 3 fail
    Test 10 pass
    User Accepted
    Verified
    
    只是为了好玩:相同,但使用RegExp(更好的缩放技术):


    我不知道你到底在干什么。Systems.Collections.ArrayList是一个.Net对象。。。那么您正在使用旧的vbscript来处理VB.Net类型?可能是
    cscript 37946075.vbs
    ----- Input:
    Test 1 pass dec 2
    Test 3 fail
    Test 2 pass jun 4
    Verified
    Test 10 pass
    User Accepted
    ----- Expected:
    Test 1 pass dec 2
    Test 2 pass jun 4
    Test 3 fail
    Test 10 pass
    User Accepted
    Verified
    ----- Output:
    Test 1 pass dec 2
    Test 2 pass jun 4
    Test 3 fail
    Test 10 pass
    User Accepted
    Verified
    
    ...
    Dim r    : Set r    = New RegExp
    r.Pattern = "^(\w+\s*)(\d+\s*)?(.*)$"
    Dim sInp, m, aParts(2)
    Dim i
    For Each sInp In aInp
        Set m = r.Execute(sInp)
        If 1 = m.Count Then
           For i = 0 To 2
               aParts(i) = m(0).SubMatches(i)
           Next
         Else
            Err.Raise "Shit hits fan"
        End If
        oSB.AppendFormat_3 "{0}{1,4}{2}", aParts(0), aParts(1), aParts(2)
        sInp = oSB.ToString() & "|" & sInp ' dirty trick: append org data to ease 'reconstruction'
    ...