带有列表的VBscript

时间:2013-01-23 12:19:23

标签: vbscript

我正在尝试编写一个VBScript,它将读取一个文本文件并构建一个包含列表的字典。让我用一个例子来解释:

输入文件将是一个简单的文本文件:

Male,Peter
Male,Chris
Male,Stewie
Male,Brian
Female,Lois
Female,Meg

当我运行我的脚本时,我想要一个字典,第一列作为键,第二列作为值

{'Male':['Peter,Chris,Stewie,Brian']}
{'Female':['Lois,Meg']}

VBScript中缺少动态数组或列表使这真的很痛苦。有什么建议我可以解决这个问题吗?

干杯

3 个答案:

答案 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