Всем привет.
Появилась задача, которую не знаю каким способом лучше реализовать.
Проблема: нужно при работе макроса кешировать пары вида Ключ|Значение
(Имеем ключ. Если в текстовом файле уже есть пара для этого ключа, надо считать значение, а если нет, то позже из того же макроса дописать туда эту пару, когда станет известно значение). Файл предназначен для использования этих данных при следующих запусках макроса (каждый запуск макроса может немного пополнять этот файл)
Ситуация осложняется следующим:
1) количество пар, которые надо кешировать, от 200 тысяч до 2 миллионов (максимум - 5 млн)
Было бы из 10-20 тысяч, — считывал бы текстовый файл, и загонял в словарь (dictionary) или коллекцию, а потом бы из словаря / коллекции в цикле формировал текстовую строку, и перезаписывал файл.
Но при больших объемах записей, на заполнение словаря / коллекции будет уходить очень много времени, да и Excel жрёт сотни мегабайтов памяти (а таких текстовых файлов может быть несколько, для разных данных)
2) есть понимание, что нужно использовать что-то типа ADO, но ранее с ним не работал.
В каком формате хранить данные - csv, sql, mdb или ещё что-то, тоже не знаю (есть разница?)
3) всё это должно работать на любой версии Excel (2003-2019) под любой версией windows (XP-10) любой разрядности (32/64), причем работать это будет на тысячах разных компов, т.е. нужно что-то такое, что будет одинаково стабильно работать на любом компе.
4) при запуске макрос должен подключаться к файлу (но желательно не считывать всё его содержимое в память, ибо Excel не любит, когда он занимает в памяти 1 гиг), и иметь возможность через ранее установленное соединение БЫСТРО находить значение по ключу (или по массиву из 100 ключей получить 100 значений), а также сравнительно быстро дописывать новые пары Ключ|Значение (с перезаписью старых ключей, если вдруг такой ключ уже существует).
Вопросы:
1) что посоветуете использовать?
ADO? другие варианты?
2) Если ADO - это на всех компах будет работать?
Там у ConnectionString всего 2 варианта написания, для Excel версии ниже 11 и выше 11, и всё?
(одной из этих 2 строк подключения достаточно, чтобы обеспечить работу на любой версии Office?)
3) в каком формате хранить этот файл с данными?
4) реально ли, чтобы после команды добавления записи, не требовалось принудительное сохранение файла?
(чтобы если макрос внезапно завершил работу, не закрыв соединение, добавленные данные не потерялись)
5) как думаете, это совсем извращением будет, если хранить все эти данные в реестре Windows?
(записывая / считывая данные через штатные функции GetSetting / SaveSetting)
В принципе, ветку реестра можно экспортировать в файл, и импортировать на другом компе.
Просто загаживать реестр винды не хочется, хотя это было бы самым простым решением.
PS: прочитал кучу тем на форуме про использование ADO, но больше путаницы, чем понимания.
Почти во всех примерах - чтение данных с листа Excel, а с поиском записи в текстовом файле - особо примеров не нашёл.
В идеале хочу получить что-то примерно такого вида:
Появилась задача, которую не знаю каким способом лучше реализовать.
Проблема: нужно при работе макроса кешировать пары вида Ключ|Значение
(Имеем ключ. Если в текстовом файле уже есть пара для этого ключа, надо считать значение, а если нет, то позже из того же макроса дописать туда эту пару, когда станет известно значение). Файл предназначен для использования этих данных при следующих запусках макроса (каждый запуск макроса может немного пополнять этот файл)
Ситуация осложняется следующим:
1) количество пар, которые надо кешировать, от 200 тысяч до 2 миллионов (максимум - 5 млн)
Было бы из 10-20 тысяч, — считывал бы текстовый файл, и загонял в словарь (dictionary) или коллекцию, а потом бы из словаря / коллекции в цикле формировал текстовую строку, и перезаписывал файл.
Но при больших объемах записей, на заполнение словаря / коллекции будет уходить очень много времени, да и Excel жрёт сотни мегабайтов памяти (а таких текстовых файлов может быть несколько, для разных данных)
2) есть понимание, что нужно использовать что-то типа ADO, но ранее с ним не работал.
В каком формате хранить данные - csv, sql, mdb или ещё что-то, тоже не знаю (есть разница?)
3) всё это должно работать на любой версии Excel (2003-2019) под любой версией windows (XP-10) любой разрядности (32/64), причем работать это будет на тысячах разных компов, т.е. нужно что-то такое, что будет одинаково стабильно работать на любом компе.
4) при запуске макрос должен подключаться к файлу (но желательно не считывать всё его содержимое в память, ибо Excel не любит, когда он занимает в памяти 1 гиг), и иметь возможность через ранее установленное соединение БЫСТРО находить значение по ключу (или по массиву из 100 ключей получить 100 значений), а также сравнительно быстро дописывать новые пары Ключ|Значение (с перезаписью старых ключей, если вдруг такой ключ уже существует).
Вопросы:
1) что посоветуете использовать?
ADO? другие варианты?
2) Если ADO - это на всех компах будет работать?
Там у ConnectionString всего 2 варианта написания, для Excel версии ниже 11 и выше 11, и всё?
(одной из этих 2 строк подключения достаточно, чтобы обеспечить работу на любой версии Office?)
3) в каком формате хранить этот файл с данными?
4) реально ли, чтобы после команды добавления записи, не требовалось принудительное сохранение файла?
(чтобы если макрос внезапно завершил работу, не закрыв соединение, добавленные данные не потерялись)
5) как думаете, это совсем извращением будет, если хранить все эти данные в реестре Windows?
(записывая / считывая данные через штатные функции GetSetting / SaveSetting)
В принципе, ветку реестра можно экспортировать в файл, и импортировать на другом компе.
Просто загаживать реестр винды не хочется, хотя это было бы самым простым решением.
PS: прочитал кучу тем на форуме про использование ADO, но больше путаницы, чем понимания.
Почти во всех примерах - чтение данных с листа Excel, а с поиском записи в текстовом файле - особо примеров не нашёл.
В идеале хочу получить что-то примерно такого вида:
| Код |
|---|
Public Connections As Collection ' коллекция Connections содержит какие-то объекты, каждый объект - подключение к одному из файлов ' но только чтобы эта коллекция подключений не занимала кучу памяти в Excel Function GetValue(ByVal key$, ByVal filename$) As String ' подключается к файлу filename$ (если подключение требуется, и ранее не установлено) ' ищет в нём ключ key$, и возвращает значение, соответствующее ключу End Function Sub SetValue(ByVal key$, ByVal value$, ByVal filename$) ' подключается к файлу filename$ (если подключение требуется, и ранее не установлено) ' и добавляет к нему запись key$|value$ End Sub |
Изменено: - 28.05.2020 21:18:19