2016-09-13 12 views
2

可変長の文字列のコレクション内の用語の頻度を計算しようとしています。コンテキストは、Accessデータベース内の記述です。 VBAでソリューションを維持することをお勧めします。区切り文字は ""(スペース)文字です。特別な文字は前もって削除されます。VBA:ワード周波数配列

私の最初のパスはちょっとした力を感じます。私はもっ​​と効率的なアプローチが可能だと思う。ここで

は私が期待する結果を提供している単一の文字列のために現在やっているものです:

Private Sub Command0_Click() 

    Dim myCol As Collection 
    Dim myArray() As String 
    Dim strArray As Variant 
    Dim strDescr, strTerm, strMsg As String 
    Dim i, j As Integer 

    Set myCol = New Collection 

    strDescr = "This is just a test only a test test test" 

    myArray = Split(strDescr, " ") 

    For Each strArray In myArray 
     On Error Resume Next 
     myCol.Add strArray, CStr(strArray) 
    Next strArray 

    For i = 1 To myCol.Count 
     strTerm = myCol(i) 
     j = 0 
     For Each strArray In myArray 
      If strArray = strTerm Then j = j + 1 
     Next strArray 
     'placeholder   
     strMsg = strMsg & strTerm & " | " & j & Chr(10) & Chr(13) 
    Next i 

    'placeholder 
    'save results into a table 
    MsgBox strMsg 

End Sub 

サンプル結果:

sample result

次に、私はこれを拡張する必要があります配列とコレクションへの単語の追加を維持するために、レコードセットをステップ実行するアプローチ。レコードセットは30Kレコード、30-60文字の大文字にすることができます。

質問:

  1. 私はレコードセット内の各列の配列に追加するにはどうすればよいですか?
  2. レコードの数を増やすと、このアプローチは失敗しますか?
  3. より良いアプローチですか?

ありがとう!

答えて

2

あなたの本能は正しい - これはかなり力強いので、うまく調整できません。そして、より良いアプローチがあります。Collectionの代わりにScripting.Dictionaryを使用します。 Collectionにはない2つの事柄があります。まず、エラーハンドラに頼らずにキーの存在を確認します(そして、単にその番号をDictionary自体に保存します)。次に、結果を簡単に抽出するためにキー配列を取得できます。

あなたのコードをよりこのような何かに変換します:

'Requires a reference to Microsoft Scripting Runtime. 
Private Sub Command0_Click() 
    Dim counts As New Scripting.Dictionary 
    Dim word As Variant 
    Dim desc As String 

    desc = "This is just a test only a test test test" 

    For Each word In Split(LCase$(desc), " ") 
     If Not counts.Exists(word) Then 
      counts.Add word, 1 
     Else 
      counts.Item(word) = counts.Item(word) + 1 
     End If 
    Next 

    For Each word In counts.Keys 
     Debug.Print word, counts(word) 
    Next 
End Sub 

は限り、あなたの最後の質問として、「どのように私は、レコードセット内の行ごとに配列に追加しますか?」 - レコードセットをループして、同じレコードに追加するだけです。Dictionary完了したら、単に合計カウントを取得することができます。

+0

Comintern、これは優れています。提案されたアプローチに感謝します! –