1

テキスト ファイルを読み取り、リストを含む辞書を作成する VBScript を作成しようとしています。例を挙げて説明しましょう:

入力ファイルは、次のような単純なテキスト ファイルです。

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

スクリプトを実行するとき、最初の列をキー、2 番目の列を値とする辞書が必要です

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

VBScript には動的な配列やリストがないため、これは非常に困難です。これにどのように取り組むことができるかについての提案はありますか?

乾杯

4

4 に答える 4

4

VBScript はSystem.Collections.ArrayList、.NET フレームワークによって提供されるクラスを使用できます。

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 が提供するコードを参照してください。

于 2013-01-23T19:21:50.013 に答える
1

言うまでもなく、私は投稿されたレポポイントの回答と競合しません;)私の投稿をコメントに変換できる場合は、お気軽に変換してください。

Ansgar のアイデア (+1) は、単一の Dictionary に基づいているので気に入っています。これで、内部に格納されているものを簡単に取得できるように思えます。

.Existsの必要性は、(a) 性別の数がわからない場合と、(b) それらがどのように見えるか (発音) がわからない場合の 2 つのケースで使用される可能性があります。あとはアンスガーの考え方と同じです。

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
于 2013-01-24T13:39:08.893 に答える
0

@Rich アプローチには欠陥があるため (-1) - キーを 2 回追加することはできません。可能であれば、名前は追加されずに上書きされます。また、Ansgar の優れたアイデア (+1) は、ヒントなしでは実際には本番環境に対応していません。その実用的な用途について:

  Const cGender = 0
  Const cName = 1

  Dim oFS    : Set oFS    = CreateObject("Scripting.FileSystemObject")
  Dim dicDic : Set dicDic = CreateObject("Scripting.Dictionary")
  Dim dicAl  : Set dicAl  = CreateObject("Scripting.Dictionary")
  Dim dicCnt : Set dicCnt = CreateObject("Scripting.Dictionary")

  Dim oFile, sLine, arrLine
  Set oFile = oFS.OpenTextFile ("so14479571.txt")
  Do Until oFile.AtEndOfStream
     sLine = oFile.Readline()
     If sLine <> "" Then
        arrLine = Split(sLine,",")
        dicCnt(arrLine(cGender)) = dicCnt(arrLine(cGender)) + 1

        If Not dicDic.Exists(arrLine(cGender)) Then
           Set dicDic(arrLine(cGender)) = CreateObject("Scripting.Dictionary")
        End If
        dicDic(arrLine(cGender))(arrLine(cName)) = Empty

        If Not dicAl.Exists(arrLine(cGender)) Then
           Set dicAl(arrLine(cGender)) = CreateObject("System.Collections.ArrayList")
        End If
        dicAl(arrLine(cGender)).Add arrLine(cName)
     End If
  Loop
  Dim sKey, sKey2
  WScript.Echo "genders:"
  For Each sKey In dicCnt
      WScript.Echo "", sKey, dicCnt(sKey)
  Next
  WScript.Echo "dic:"
  For Each sKey In dicDic
      WScript.Echo "", sKey
      For Each sKey2 In dicDic(sKey)
          WScript.Echo " ", sKey2
      Next
  Next
  WScript.Echo "AL:"
  For Each sKey In dicAl
      WScript.Echo "", sKey & ":", Join(dicAl(sKey).ToArray())
  Next

出力:

genders:
 Male 4
 Female 2
dic:
 Male
  Peter
  Chris
  Stewie
  Brian
 Female
  Lois
  Meg
AL:
 Male: Peter Chris Stewie Brian
 Female: Lois Meg

スクリプトは次のように表示されます。

  1. 自動有効化できる「単純な」値の .Exists なしで代入を使用する方法 (ここでは数値)
  2. Arrays、ArrayLists、または Dictionaries などの値の .Exists チェックが必要であること
于 2013-01-23T19:57:21.253 に答える
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
于 2013-01-23T12:40:38.387 に答える