VBScript 对文件中的行进行排序 [英] VBScript to sort lines in a file
问题描述
我正在尝试使用 VBScript (MS Internet Explorer) 对文件中的行进行排序.基本上我读取文件并将所有行转换为数组.基本上我需要对每行字符 23 和 27 之间写的任何内容进行排序.所以基本上我可以使用 MID
获取这些字符.这些字符每行都不是唯一的(所以我不能直接使用 System.Collections.Sortedlist
或类似的东西).
I'm trying to sort lines in a file using VBScript (MS Internet Explorer). Basically I read the file and converted all the lines to an array. Basically I need to sort on whatever is written between character 23 and 27 of each line. So basically I can get those characters using MID
. These characters are not unique per line (so I can't use System.Collections.Sortedlist
directly, or something similar unfortunately).
我可以使用 System.Collections.Sortedlist
并使用 23 到 27 之间的字符作为键,并使用其他 System.Collections.Sortedlist
对象作为一个值,填充了每个唯一值(所以是一个二维数组),但这会是正确的方法吗?例如:
I may be able to use System.Collections.Sortedlist
and use the characters between 23 and 27 as a key and use an other System.Collections.Sortedlist
object as a value, filled with every unique value (so a 2-dimensional array), but will this be the right way? 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"
}
}
有没有更好的方法来处理这个问题?还要注意输出格式应该再次是一个数组.
Is there a better way to handle this? Also note the output format should be an array again.
推荐答案
作为预告(另见 ArrayList、
As teaser (see also ArrayList, Disconnected Recordset and ArrayList ):
Dim aTest : aTest = Array( _
". Z 0" _
, ", B 2" _
, "? A 1" _
)
WScript.Echo "----- ArrayList"
WScript.Echo "original data: ", "[""" & Join(aTest , """ """) & """]"
WScript.Echo "AL: (full) ", "[""" & Join(sortAL(aTest) , """ """) & """]"
WScript.Echo "AL: (numerical) ", "[""" & Join(sortAL(Array(12, 9, -1)) , """ """) & """]"
WScript.Echo "AL: (dates) ", "[""" & Join(sortAL(Array(Now + 5, Now - 5)), """ """) & """]"
WScript.Echo "AL: (Mid(elm,3,1))", "[""" & Join(sortAL_31(aTest) , """ """) & """]"
WScript.Echo "----- Disconnected Recordset"
WScript.Echo "DRS: (Mid(elm,3,1))", "[""" & Join(sortDRS_Substring(aTest, 3, 1) , """ """) & """]"
WScript.Echo "DRS: (Mid(elm,5,1))", "[""" & Join(sortDRS_Substring(aTest, 5, 1) , """ """) & """]"
' ArrayList.Sort handles homogenous arrays of simple types just fine,
' but looks at the element in full. For other cases, you need extra work
' or ADO
Function sortAL(aX)
Dim al : Set al = CreateObject("System.Collections.ArrayList")
Dim elm
For Each elm In aX
al.Add elm
Next
al.Sort
sortAL = al.ToArray()
End Function
' Extra work: feeding pre-processed data to the ArrayList; hardcoded
Function sortAL_31(aX)
Const csSep = ":"
Dim al : Set al = CreateObject("System.Collections.ArrayList")
ReDim a(UBound(aX))
Dim elm
For Each elm In aX
al.Add Mid(elm, 3, 1) & csSep & elm
Next
al.Sort
For elm = 0 To UBound(a)
a(elm) = Split(al(elm), csSep)(1)
Next
sortAL_31 = a
End Function
' more flexible: ADO DRS + a start at parametrization; handling different
' types is left as an exercise
Function sortDRS_Substring(aX, nFrom, nLen)
Const adVarChar = 200 ' 000000C8
Const adClipString = 2 ' 00000002
Const csSep = ":"
ReDim a(Ubound(aX))
Dim oRS : Set oRS = CreateObject("ADODB.Recordset")
oRS.Fields.Append "FORG", adVarChar, 250
oRS.Fields.Append "FSUB", adVarChar, 250
oRS.Open
Dim elm
For Each elm In aX
oRS.AddNew
oRS.Fields("FORG").value = elm
oRS.Fields("FSUB").value = Mid(elm, nFrom, nLen)
oRS.UpDate
Next
oRS.Sort = "FSUB"
oRS.MoveFirst
For elm = 0 To UBound(a)
a(elm) = oRS.Fields("FORG").value
oRS.MoveNext
Next
sortDRS_Substring = a
End Function
输出:
----- 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"]
这篇关于VBScript 对文件中的行进行排序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!