2016-09-14 4 views
3

Благодаря полезной руке, предоставленной ранее, у меня есть функциональный подход для вычисления частоты слов среди строк в наборе записей. Следующий код дает желаемый результат.Доступ к VBA: Scripting.Dictionary - Dump to Table?

Последний шаг будет заключаться в том, чтобы вывести структуру словаря в таблицу Access в currentDB. Я могу шагнуть через каждый ключ, как это прокомментировано ниже, и добавить к таблице через SQL - но это очень медленные условия w/24K.

ОБНОВЛЕНО >> ж/Решение < <

Private Sub Command0_Click() 

Dim counts As New Scripting.Dictionary 
Dim word As Variant 
Dim desc As String 

Dim rs1 As DAO.Recordset 
Dim rs2 As DAO.Recordset '<< solution 
Dim strSQL As String 
Dim db As Database 

Set db = CurrentDb 

strSQL = "SELECT DISTINCT Items.Description FROM Items ;" 

Set rs1 = db.OpenRecordset(strSQL, dbOpenDynaset) 

Do While Not rs1.EOF 
    For Each word In Split(rs1!Description, " ") 
     If Not counts.Exists(word) Then 
      counts.Add word, 1 
     Else 
      counts.Item(word) = counts.Item(word) + 1 
     End If 
    Next 
    rs1.MoveNext 
Loop 

'>> .AddNew Solution inserted as suggested below << 

rs2 = db.OpenRecordset("Freq", dbOpenTable) 

For Each word In counts.Keys 
    With rs2 
     .AddNew    ' Add new record 
     .Fields!Term = word 
     .Fields!Freq = counts(word) 
     .Update 
     .Bookmark = .LastModified 
    End With 
Next 

rs2.Close 

'>> End Solution << 

Set rs1 = Nothing 
Set rs2 = Nothing 

MsgBox "Done" 

End Sub 

Вопрос:

  1. Могу ли я сбросить словарь в таблицу в BULK, против шагая через клавиши одну за другой?

Обоснование: проще (для меня) выполнять представление ниже по потоку & манипуляции с использованием структуры таблицы.

Спасибо!

+1

Там действительно не способ сделать это без зацикливания. Даже в .NET наиболее близким из словарей является массив пар ключ/значение. Соединения DAO должны обеспечивать хорошую производительность с помощью цикла INSERT. – Comintern

+0

Почему бы не добавить это непосредственно в таблицу, вместо того, чтобы сначала писать в словарь. Затем вы можете просто сгруппировать данные со счетом. –

ответ

1

Ваш код не показывает, как вы пытались вставить строки - с отдельными операторами INSERT INTO (...) VALUES (...) для каждой строки, я предполагаю?

Для нескольких вставок в цикле не используйте инструкции SQL INSERT. Вместо этого используйте DAO.Recordset с .AddNew, это будет намного быстрее.

Смотрите этот ответ: https://stackoverflow.com/a/33025620/3820271

А вот для примера: https://stackoverflow.com/a/36842264/3820271

+1

Andre, 17K ".AddNew" вставляет, как вы предполагали <1 сек. Не ожидал этого! Спасибо (я изменил свой код выше, чтобы отразить часть «.AddNew»). –

+0

@MarkPelletier: вы можете сбрить еще несколько ms, удалив '.Bookmark = .LastModified' - это необходимо, только если вы хотите прочитать данные из недавно добавленной записи, например. основной ключ Autonumber. – Andre

Смежные вопросы