【问题标题】:Sort multidimensional array in VBScript在 VBScript 中对多维数组进行排序
【发布时间】:2018-11-20 10:55:38
【问题描述】:

请问如何根据孔大小参数对多维数组进行“排序”?

例如:一个简单的例子是(从文本文件加载):

> 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

【问题讨论】:

  • 这看起来像 3 个独立的数组而不是多维数组,它也不是 vbscript(它可能是有效的 js)Liv1 及其成员是什么 vbscript 数据结构?
  • 抱歉,我正在重新获取脚本并发布更多信息,谢谢
  • 嗨,你是对的有 3 个独立的数组孔大小,HoleX 和 HoleY,数据类型都是“实数”从文本文件中读取时,它以字符串形式出现,我转换为实数.我正在努力寻找一种方法来对这些数组进行排序,不幸的是我只有 VBScript 可以使用

标签: arrays sorting vbscript


【解决方案1】:

由于 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)为二维数组,那么您可以得到的最好的朋友是断开连接的 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

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

再次重申:如果这看起来很有希望,我们可以讨论如何根据您的需求调整/简化此概念验证代码。

【讨论】:

  • 我非常喜欢断开连接的记录集。如此多才多艺。
  • 嗨,非常感谢,这看起来很棒,今晚我会拿着测试文件坐下来回复,谢谢!
  • 嗨,这太棒了,谢谢,第一次有希望的迹象,你展示的最后一个例子看起来很棒。请问,我把最后一个块的代码复制到c:\MyFile.vbs,然后在cmd提示符下运行cscript MyFile.vbs,得到错误“C:\MyFile.vbs(26,7) ADODB.字段:参数类型错误、超出可接受范围或相互冲突”。请问我执行它的方式可能有问题吗?我试图通过用数字“1”替换“adInteger”来调试我的身边,但仍然得到同样的错误,谢谢!
  • @PeterPitLock adInteger=3: adClipString=2 看看 adovbs.inc
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2017-11-09
  • 2023-03-23
  • 2013-03-11
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多