2012-09-05 36 views
1

如何根據孔大小參數對多維數組進行「排序」?在VBScript中排序多維數組

例如:一個簡單的例子是(從文本文件中加載):

> Liv1.HoleSize[0] = 22 Liv1.HoleX[0] = 250 Liv1.HoleY[0] = -55 
> Liv1.HoleSize[1] = 14 Liv1.HoleX[1] = 750 Liv1.HoleY[1] = 0 
> Liv1.HoleSize[2] = 22 Liv1.HoleX[2] = 900 Liv1.HoleY[2] = -55 

則必然導致:

> Liv1.HoleSize[0] = 14 Liv1.HoleX[0] = 750 Liv1.HoleY[0] = 0 
> Liv1.HoleSize[1] = 22 Liv1.HoleX[1] = 250 Liv1.HoleY[1] = -55 
> Liv1.HoleSize[2] = 22 Liv1.HoleX[2] = 900 Liv1.HoleY[2] = -55 
+0

看起來像3個獨立的數組不是多維數組,它也不是vbscript(它可能是有效的js)什麼樣的vbscript數據結構是Liv1及其成員? –

+0

道歉,我又收到腳本和張貼更多的信息,謝謝 –

+0

嗨,你是正確的 有3個獨立的數組 開孔尺寸,HoleX而多孔, 的數據類型都是「真正的」數字 讀取當文本文件它以字符串形式進入,我轉換成實數。我正在努力尋找一種方法來排序這些數組,不幸的是我只有VBScript與 –

回答

4

如VBScript沒有本機排序,你就必須推出你自己分類,或者從朋友那裏得到一點幫助。

如果你的任務是要排序的輸入文件(逐字給出),以指定順序的輸出文件,sort.exe是你的朋友:

Dim sIn : sIn = "..\data\in00.txt" 
    WScript.Echo readAllFromFile(sIn) 
    WScript.Echo "-----------" 
    Dim sCmd : sCmd = "sort /+19 " & qq(resolvePath(sIn)) 
    Dim aRet : aRet = goWSLib.Run(sCmd) 
    If aRet(0) Then 
    ' handle error 
    Else 
    WScript.Echo aRet(2) 
    End If 

輸出:

================================================================ 
Liv1.HoleSize[0] = 22 Liv1.HoleX[0] = 250 Liv1.HoleY[0] = -55 
Liv1.HoleSize[1] = 14 Liv1.HoleX[1] = 750 Liv1.HoleY[1] = 0 
Liv1.HoleSize[2] = 22 Liv1.HoleX[2] = 900 Liv1.HoleY[2] = -55 

----------- 
Liv1.HoleSize[1] = 14 Liv1.HoleX[1] = 750 Liv1.HoleY[1] = 0 
Liv1.HoleSize[0] = 22 Liv1.HoleX[0] = 250 Liv1.HoleY[0] = -55 
Liv1.HoleSize[2] = 22 Liv1.HoleX[2] = 900 Liv1.HoleY[2] = -55 

================================================================ 

如果某樣東西像這樣可以解決你的問題,就這麼說,我們可以在庫函數中討論支持代碼。

但是,如果你(要)解析(d)輸入文件轉換成二維數組,你可以得到的最好的朋友是一個disconnectes ADODB記錄:

Dim aData : aData = Split(Join(Array(_ 
      "22 250 -55" _ 
     , "14 750 0" _ 
     , "22 900 -55" _ 
     , "11 222 333" _ 
))) 
    Dim afData(3, 2) 
    Dim nRows : nRows = UBound(afData, 1) 
    Dim nCols : nCols = UBound(afData, 2) 
    Dim i, r, c 
    For i = 0 TO UBound(aData) 
     r = i \ nRows 
     c = i Mod (nCols + 1) 
     afData(r, c) = aData(i) 
'  WScript.Echo i, r, c, aData(i) 
    Next 
    For r = 0 To nRows 
     For c = 0 To nCols 
      WScript.StdOut.Write vbTab & afData(r, c) 
     Next 
     WScript.Echo 
    Next 
    WScript.Echo "-----------------" 
    Dim oRS : Set oRS = CreateObject("ADODB.Recordset") 
    For c = 0 To nCols 
     oRS.Fields.Append "Fld" & c, adInteger 
    Next 
    oRS.Open 
    For r = 0 To nRows 
     oRS.AddNew 
     For c = 0 To nCols 
      oRS.Fields(c).value = afData(r, c) 
     Next 
     oRS.UpDate 
    Next 
    oRS.Sort = "Fld0" 
    WScript.Echo oRS.GetString(adClipString, , vbTab, vbCrLf) 
    WScript.Echo "-----------------" 
    oRS.Sort = "Fld2" 
    WScript.Echo oRS.GetString(adClipString, , vbTab, vbCrLf) 

輸出:

======================================== 
     22  250  -55 
     14  750  0 
     22  900  -55 
     11  222  333 
----------------- 
11  222  333 
14  750  0 
22  250  -55 
22  900  -55 

----------------- 
22  250  -55 
22  900  -55 
14  750  0 
11  222  333 

======================================== 

再說一遍:如果看起來很有希望,我們可以討論如何根據您的需求調整/簡化概念驗證代碼。

+0

一起工作我非常喜歡斷開的記錄集。如此多才多藝。 – Fionnuala

+0

嗨,非常感謝,這看起來很神奇,我今晚會帶着測試文件和回覆,謝謝! –

+0

嗨,這是非常明智的感謝,第一次有希望的跡象,你展示的最後一個例子看起來很棒。我可以問一下,我把最後一塊的代碼複製到c:\ MyFile.vbs中,然後在cmd提示符下運行cscript MyFile.vbs,並得到錯誤「C:\ MyFile.vbs(26,7)ADODB。字段:參數的類型錯誤,超出可接受的範圍,或者彼此衝突「。我在那裏可能有什麼不對嗎?我試圖通過用數字「1」替換「adInteger」來調試我的方面,但仍然得到相同的錯誤,謝謝! –