我正在尝试编写一个VBScript,它将读取一个文本文件并构建一个包含列表的字典。让我用一个例子来解释:
输入文件将是一个简单的文本文件:
Male,Peter
Male,Chris
Male,Stewie
Male,Brian
Female,Lois
Female,Meg
当我运行我的脚本时,我想要一个字典,第一列作为键,第二列作为值
{'Male':['Peter,Chris,Stewie,Brian']}
{'Female':['Lois,Meg']}
VBScript中缺少动态数组或列表使这真的很痛苦。有什么建议我可以解决这个问题吗?
干杯
答案 0 :(得分:4)
VBScript可以使用.NET框架提供的System.Collections.ArrayList
类。
Set d = CreateObject("Scripting.Dictionary")
d.Add "Male", CreateObject("System.Collections.ArrayList")
d.Add "Female", CreateObject("System.Collections.ArrayList")
d("Male").Add "Peter"
d("Male").Add "Chris"
'...
d("Female").Add "Lois"
d("Female").Add "Meg"
'...
要处理输入文件,请查看@Rich提供的代码。
答案 1 :(得分:1)
只是说,我不会与回复点的已发布答案竞争;) 如果您可以将我的帖子转换为评论,请随意这样做。
我喜欢Ansgar的想法(+1),因为它基于单一的词典,而且在我看来已经足够容易回复存储在里面的东西了。
.Exists 的需要可能会在2个案例中使用 - (a)如果我们不知道我们有多少性别,(b)如果我们不知道他们如何看起来像(发音)。其余的与Ansgar的想法相似。
Option Explicit
Const cGender = 0
Const cName = 1
Dim sGender, sName, sLine
Dim oFSO, oFile, oDict
Dim arrLine
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oDict = CreateObject("Scripting.Dictionary")
Set oFile = oFSO.OpenTextFile("persons_list.txt")
Do Until oFile.AtEndOfStream
sLine = oFile.ReadLine
If Len(sLine) Then
arrLine = Split(sLine, ",")
sGender = arrLine(cGender)
sName = arrLine(cName)
If Not oDict.Exists(sGender) Then
oDict.Add sGender, CreateObject("System.Collections.ArrayList")
End If
oDict(sGender).Add sName
End If
Loop
oFile.Close
Set oFile = Nothing
Set oFSO = Nothing
WScript.Echo "Genders:" & oDict.Count, vbNewLine & Join(oDict.Keys)
Dim sKey
For Each sKey In oDict
WScript.Echo sKey, oDict(sKey).Count, vbNewLine & Join(oDict(sKey).ToArray())
Next
答案 2 :(得分:0)
我对词典对象不太熟悉,但这可能就足够了吗?
Set oFso = CreateObject("Scripting.FileSystemObject")
Set oDictionary = CreateObject("Scripting.Dictionary")
Const cGender = 0
Const cName = 1
Set oFile = oFso.OpenTextFile ("yourfile.txt", 1)
Do Until oFile.AtEndOfStream
sLine = oFile.Readline
If sLine <> "" Then
arrLine = split(sLine,",")
oDictionary.Add arrLine(cGender,0), arrLine(cName,0) 'hope i got these indexes the right way round
'or
oDictionary.Add arrLine(cGender), arrLine(cName) 'if its one dimentional
End If
Loop