2016-09-13 4 views
2

Я пытаюсь вычислить частоту слагаемых в наборе строк переменной длины. Контекст - это описание в базе данных Access. Предпочитаете сохранить решение в VBA. Разделителем является символ «" (пробел). Специальные символы будут удалены заранее.VBA: Word Frequency Array

Мой первый проход чувствует себя немного грубой силой; Я подозреваю, что возможен гораздо более эффективный подход.

Вот что я делаю в данный момент для одной строки, которая обеспечивает результат я ожидаю:

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

Далее, мне нужно, чтобы расширить это подход к шагу через набор записей, чтобы добавить слова в массив и коллекцию. Записи могут быть большими, 30 тыс. Записей, descr - 30-60 символов.

Вопросы:

  1. Как добавить в массив для каждой строки в наборе записей?
  2. Будет ли этот подход терпеть неудачу, поскольку я масштабирую количество записей?
  3. Лучший подход?

Спасибо!

ответ

2

Ваш инстинкт верный - это довольно грубая сила, поэтому он не будет хорошо масштабироваться. И да, есть лучший подход - я бы использовал Scripting.Dictionary вместо Collection. Он позволяет 2 вещи, которые Collection не делает: во-первых, вы можете проверить наличие ключа, не полагаясь на обработчик ошибок (и просто хранить подсчеты в самом 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

Коминтерн, это отлично. Спасибо за предложенный подход! –