2016-09-13 4 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 레코드 일 수 있으며, descr은 30-60 자입니다.

질문 :

  1. 어떻게 레코드의 각 행에 대한 배열에 추가합니까?
  2. 레코드 수를 조정할 때이 방법이 실패합니까?
  3. 더 나은 접근 방법은 무엇입니까?

고마워요!

답변

2

당신의 본능은 정확합니다 - 이것은 꽤 무차별 적이며 잘 확장되지 않습니다. 그리고 네, 더 나은 접근법이 있습니다 - 나는 Collection 대신 Scripting.Dictionary를 사용할 것입니다. Collection에는없는 두 가지 사항이 있습니다. 첫째, 오류 처리기에 의존하지 않고 키의 존재 여부를 확인할 수 있습니다 (단순히 카운트를 Dictionary 자체에 저장하면됩니다). 둘째, Keys 배열을 검색하여 결과를 쉽게 추출 할 수 있습니다.

귀하의 코드를 더 이런 식으로 뭔가로 번역 것 :

'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

코민테른, 이것은 우수합니다. 제안 된 접근 방식을 주셔서 감사합니다! –