有人知道一种相当快速的方法来获取正在访问的键的脚本字典内的完整路径吗?当前个人项目的一个示例是在torrent中查找某些文件或路径。使用单个种子文件之类的小东西,就很容易创建树视图并进行搜索,并对路径进行反向工程,因为它被构造为与字典相对应。但是,当加载诸如2000 torrent的utorrent resume.dat文件之类的内容时,创建和搜索树状视图会花费很多时间,而几乎可以立即创建和搜索字典。但是,我希望能够重建与创建的完整树视图相对应的找到的数据的树视图(如果创建整个树,它将显示为单个节点路径)。
我熟悉Ultima的Bencode编辑器项目,该项目很棒,我会不时使用,但仅满足我的部分需求。他必须完成类似的工作,但要保持自己的代码私有。我拼凑了VB6 / VBA代码,可帮助我创建和处理此类数据的树形视图。但是,作为VBA / 6,它非常慢(特别是因为我需要对其进行排序),并且我既没有时间,也没有技能将其移植到C变体中以加速它,然后用COM / ActiveX进行它。返回,所以我可以在Excel 2007 VBA中使用它。因此,以单个torrent文件为例,我正在寻找的东西可能会给我返回类似以下的路径:
/ info(0)/ files(1)/ path(2)
当我从类似结构中找到某些东西(“ VIDEO_TS.IFO”)时
info(d)[4]
files(l)[141]
Item 1(d)[2]
length(i)=24576
path(l)[3]
Disk1.ep1-9
VIDEO_TS
VIDEO_TS.BUP
Item 2(d)[2]
length(i)=24576
path(l)[3]
Disk1.ep1-9
VIDEO_TS
VIDEO_TS.IFO
(即,如果dict.item =则PathToDictItem(dict.item)=)
是的,当我遍历(搜索)字典时,我可以不断传递构造好的键(听起来并不那么简单)。但是,一旦找到值,我就可以简单地访问键的完整字典路径,那么我的生活就会变得更加轻松。我只是希望有一个比我更聪明的人知道一种相对简单的方法,而我却忽略了这一点。
有几个与此类似的问题,它们在python中讨论了一个称为“ yield”的问题,但我还不太熟悉,无法弄清楚他们是否完成了我想要的工作,而且我也不相信VBA具有同等的能力。
根据蒂姆·威廉姆斯的要求,这是产生小数据示例的代码的根:
Private Sub WalkDict(d As Variant, indent As Long)
Dim k, t
For Each k In d.keys
t = TypeName(d.Item(k))
Select Case t
Case "Integer", "Long", "Currency"
Debug.Print Space(indent * 2); k; "(i)="; Trim(CStr(d.Item(k)))
Case "String"
Debug.Print Space(indent * 2); k; "(b)["; Trim(CStr(Len(d.Item(k)))); "]=";
If Len(d.Item(k)) < 100 Then Debug.Print d.Item(k) Else Debug.Print Left(d.Item(k), 96); " ..."
Case "Variant()"
Debug.Print Space(indent * 2); k; "(l)[";
If IsDimmed(d.Item(k)) Then
Debug.Print Trim(UBound(d.Item(k)) + 1); "]"
WalkList d.Item(k), indent + 1
Else
Debug.Print "0]"
End If
Case "Dictionary"
Debug.Print Space(indent * 2); k; "(d)["; Trim(UBound(d.Item(k).keys) + 1); "]"
WalkDict d.Item(k), indent + 1
Case Else
Stop 'oops
End Select
Next
End Sub
Private Sub WalkList(l As Variant, indent As Long)
Dim li, lin, t
For Each li In l
lin = lin + 1
t = TypeName(li)
Select Case t
Case "Integer", "Long", "Currency"
Debug.Print Space(indent * 2); li; "(i)="; li.Item(li)
Case "String"
Debug.Print Space(indent * 2); li
Case "Variant()"
WalkList li, indent + 1
Case "Dictionary"
Debug.Print Space(indent * 2); "Item "; Trim(CStr(lin)); "(d)["; Trim(UBound(li.keys) + 1); "]"
WalkDict li, indent + 1
Case Else
Stop 'oops
End Select
Next
End Sub
试想一下,在任何时候我都在打印一个值,我将根据标准检查该数据,并且,如我曾试图弄清楚的,如果匹配,我想获得完整的字典路径该键/值。
我了解到VBA不太可能立即提供此功能,而且我已经在尝试将密钥构建整合到调用中。只是列表使它变得更加复杂,因为它们没有使用与字典其余部分相同的命名和键。
我只是知道我是一个相对不为人知的业余爱好者,并且有很多聪明而经验丰富的程序员在这些论坛中徘徊,我希望其中一个曾经解决过这个问题。
答案 0 :(得分:0)
如果我正确理解了这个问题,我可能会在解析数据时使用Sqlite来存储数据,然后运行查询以使排序后的数据返回(重新)填充树视图。我相信您可以将Sqlite数据库保留在内存中,而无需写入磁盘以提高性能。
我打算对此发表评论,但我无法发表评论。