Sorting VBScript对文件中的行进行排序

Sorting VBScript对文件中的行进行排序,sorting,vbscript,Sorting,Vbscript,我正在尝试使用VBScript(MS Internet Explorer)对文件中的行进行排序。基本上,我读取文件并将所有行转换为数组。基本上,我需要对每行23到27字符之间的内容进行排序。因此,基本上我可以使用MID获取这些字符。这些字符不是每行唯一的(因此我不能直接使用System.Collections.Sortedlist,或者类似的东西) 我可以使用System.Collections.Sortedlist,使用23和27之间的字符作为键,并使用另一个System.Collection

我正在尝试使用VBScript(MS Internet Explorer)对文件中的行进行排序。基本上,我读取文件并将所有行转换为数组。基本上,我需要对每行23到27字符之间的内容进行排序。因此,基本上我可以使用
MID
获取这些字符。这些字符不是每行唯一的(因此我不能直接使用
System.Collections.Sortedlist
,或者类似的东西)

我可以使用
System.Collections.Sortedlist
,使用23和27之间的字符作为键,并使用另一个
System.Collections.Sortedlist
对象作为值,填充每个唯一的值(因此是二维数组),但这是正确的方法吗?e、 g:

(System.Collections.Sortedlist) {
    "0001" => (System.Collections.Sortedlist) {
        0 => "0001 some unique value1"
        1 => "0001 some unique value2"
        2 => "0001 some unique value3"
    },
    "0002" => (System.Collections.Sortedlist) {
        0 => "0002 some unique value1"
        1 => "0002 some unique value2"
        2 => "0002 some unique value3"
    }
}
有没有更好的方法来处理这个问题? 另请注意,输出格式应再次为数组。

作为摘要(另请参见):

输出:

----- ArrayList
original data:      [". Z 0"  ", B 2"  "? A 1"]
AL:  (full)         [", B 2"  ". Z 0"  "? A 1"]
AL:  (numerical)    ["-1"  "9"  "12"]
AL:  (dates)        ["1/23/2013 5:00:22 PM"  "2/2/2013 5:00:22 PM"]
AL:  (Mid(elm,3,1)) ["? A 1"  ", B 2"  ". Z 0"]
----- Disconnected Recordset
DRS: (Mid(elm,3,1)) ["? A 1"  ", B 2"  ". Z 0"]
DRS: (Mid(elm,5,1)) [". Z 0"  "? A 1"  ", B 2"]
作为挑逗者(另见,):

输出:

----- ArrayList
original data:      [". Z 0"  ", B 2"  "? A 1"]
AL:  (full)         [", B 2"  ". Z 0"  "? A 1"]
AL:  (numerical)    ["-1"  "9"  "12"]
AL:  (dates)        ["1/23/2013 5:00:22 PM"  "2/2/2013 5:00:22 PM"]
AL:  (Mid(elm,3,1)) ["? A 1"  ", B 2"  ". Z 0"]
----- Disconnected Recordset
DRS: (Mid(elm,3,1)) ["? A 1"  ", B 2"  ". Z 0"]
DRS: (Mid(elm,5,1)) [". Z 0"  "? A 1"  ", B 2"]

我想建议的功能几乎与Ekkehard Horner的
sortAL_31
相同

Function CustomSort(ByVal inpArray, ByVal nFrom, ByVal nLen)
    Dim oList, aTmp(), nSize, i
    nSize = UBound(inpArray)
    ReDim aTmp(nSize)
    With CreateObject("System.Collections.ArrayList")
        For i = 0 To nSize
            .Add Mid(inpArray(i), nFrom, nLen) & _
                vbNullChar & inpArray(i)
        Next
        .Sort
        For i = 0 To nSize
            aTmp(i) = Split(.Item(i), vbNullChar)(1)
        Next
    End With
    CustomSort = aTmp
End Function
[编辑]使用
SortedList
追加版本

Function CustomSort2(inpArray, nFrom, nLen)
    Dim oSList, aTmp(), nSize, i
    nSize = UBound(inpArray)
    ReDim aTmp(nSize)
    Set oSList = CreateObject("System.Collections.SortedList")
    For i = 0 To nSize
        oSList.Add Mid(inpArray(i), nFrom, nLen), inpArray(i)
    Next
    For i = 0 To nSize
        aTmp(i) = oSList.GetByIndex(i)
    Next
    Set oSList = Nothing
    CustomSort2 = aTmp
End Function

我想建议的功能几乎与Ekkehard Horner的
sortAL_31
相同

Function CustomSort(ByVal inpArray, ByVal nFrom, ByVal nLen)
    Dim oList, aTmp(), nSize, i
    nSize = UBound(inpArray)
    ReDim aTmp(nSize)
    With CreateObject("System.Collections.ArrayList")
        For i = 0 To nSize
            .Add Mid(inpArray(i), nFrom, nLen) & _
                vbNullChar & inpArray(i)
        Next
        .Sort
        For i = 0 To nSize
            aTmp(i) = Split(.Item(i), vbNullChar)(1)
        Next
    End With
    CustomSort = aTmp
End Function
[编辑]使用
SortedList
追加版本

Function CustomSort2(inpArray, nFrom, nLen)
    Dim oSList, aTmp(), nSize, i
    nSize = UBound(inpArray)
    ReDim aTmp(nSize)
    Set oSList = CreateObject("System.Collections.SortedList")
    For i = 0 To nSize
        oSList.Add Mid(inpArray(i), nFrom, nLen), inpArray(i)
    Next
    For i = 0 To nSize
        aTmp(i) = oSList.GetByIndex(i)
    Next
    Set oSList = Nothing
    CustomSort2 = aTmp
End Function

VBScript?在IE里?我是否陷入了时间扭曲,2001年又一次重演。。客户机使用它。再过一年。我目前正在一台win2k机器上工作。快得像地狱一样,但真的脱光了衣服。我甚至不能安装.NET3.5框架..哇,听起来像是一个web开发人员的特殊版本的地狱。我打赌他们也被困在IE6上,对吧?如果您已经有了工作代码,我建议您使用它;不要担心找到更好的方法;客户显然对最佳实践不感兴趣。@JvN-请看这里:了解如何使用断开连接的记录集或.Net集合(以及一些额外的工作)。@Ekkehard.Horner-Uhm。那看起来是个不错的东西。谢谢VBScript?在IE里?我是否陷入了时间扭曲,2001年又一次重演。。客户机使用它。再过一年。我目前正在一台win2k机器上工作。快得像地狱一样,但真的脱光了衣服。我甚至不能安装.NET3.5框架..哇,听起来像是一个web开发人员的特殊版本的地狱。我打赌他们也被困在IE6上,对吧?如果您已经有了工作代码,我建议您使用它;不要担心找到更好的方法;客户显然对最佳实践不感兴趣。@JvN-请看这里:了解如何使用断开连接的记录集或.Net集合(以及一些额外的工作)。@Ekkehard.Horner-Uhm。那看起来是个不错的东西。谢谢我喜欢(+1.3):使用vbNullChar作为分隔符;我不喜欢的是(-0.2):aTmp()是VBScript之外的一个VB/VBA习惯用法(尝试获取它的UBound());我不会做的事(-0.05):在任何参数上使用ByVal-尤其是inpArray的副本没有任何意义。谢谢,我感谢您的评论。至于aTmp(),我真的不明白你的意思。我只是尝试将对UBound()的调用减少到一次。或者您的意思是省略Dim aTmp(),直接使用ReDim aTmp(nSize)?是的,“Dim aTmp()”创建了一个VBScript甚至无法绑定的讨厌对象();一个简单的“ReDim aTmp()”就足够了(甚至对于“Option Explicit”)。我喜欢(+1.3):使用vbNullChar作为分隔符;我不喜欢的是(-0.2):aTmp()是VBScript之外的一个VB/VBA习惯用法(尝试获取它的UBound());我不会做的事(-0.05):在任何参数上使用ByVal-尤其是inpArray的副本没有任何意义。谢谢,我感谢您的评论。至于aTmp(),我真的不明白你的意思。我只是尝试将对UBound()的调用减少到一次。或者您的意思是省略Dim aTmp(),直接使用ReDim aTmp(nSize)?是的,“Dim aTmp()”创建了一个VBScript甚至无法绑定的讨厌对象();简单的“ReDim aTmp()”就足够了(即使是“Option Explicit”)。