VBA самый быстрый способ поиска xml-файла размером 40 Мб или преобразования двоичного массива этого файла в строку для поиска
Привет, У меня есть VBA, работающая за MS Access. Мне нужно постоянно искать и извлекать данные из файла размером 40 Мб. Он слишком большой, чтобы загрузить его в строковую переменную. Я загрузил его в двоичный массив (довольно быстро, я мог бы добавить), но я не знаю, как использовать этот формат.....Я, кажется, не могу понять, как перебирать массив по байту за раз в поисках строки...... Поэтому я отбросил эту идею...(но я готов научиться использовать эту стратегию)..Я перехожу к поиску на основе FilesystemObject; вот что у меня есть до сих пор:
Я получаю начало(x) и конец (y) узла и затем помещаю его в плоскую переменную.
Set ts = FSO.OpenTextFile(DLookup("gsgtver", "Eramdat", "EramID = 1"), ForReading, False, TristateFalse)
x = InStr(1, ts.ReadAll, ">" & sFirst & "<")
ts.Close
Set ts = FSO.OpenTextFile(DLookup("gsgtver", "Eramdat", "EramID = 1"), ForReading, False, TristateFalse)
y = InStr(x, ts.ReadAll, "</FixRecord")
ts.Close
Set ts = FSO.OpenTextFile(DLookup("gsgtver", "Eramdat", "EramID = 1"), ForReading, False, TristateFalse)
FLat = Mid(ts.ReadAll, x, y - x)
ts.Close
Если бы мне не пришлось делать это от 10 до 120 раз, я бы списал это на "приемлемое состояние ожидания", но, как вы можете догадаться, это неприемлемо. Есть предложения, как сделать это более ловко?2 ответа:
Я вижу, что вы ищете скользкость, поэтому я советую загрузить ваш XML-файл в объект XML-документа. Зачем рассматривать XML-информацию как строку "суп", когда она на самом деле аккуратно организована в легко доступной для поиска иерархии?
Dim xmlDoc As Object Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0") xmlDoc.async = False ' Don't ask. xmlDoc.Load "C:\myfile.xml" 'Voilà, your XML is loaded and parsed, ready to be searched.
Смотрите документальную форму XML DOMDocuments здесь.
Тогда вы можете иметь произвольный доступ к данным в XML-документе, используя обозначение XPath (учебник здесь ), например
Set someElement = _ xmlDoc.selectSingleNode("//MyElementName[@MyAttributeName = 'blabla']") theStringINeed = someElement.Text
Где материал в кавычках-это XPath. Я конечно, вы можете получить то, что ищете, используя один оператор XPath. XML-объект будет выполнять поиск для вас, если вы скажете ему, что вы ищете. Вот для чего он существует.
Это действительно правильный способ доступа к информации в формате XML. Все остальное, и вы действительно делаете свою собственную жизнь несчастной по сравнению с этим.
Как насчет следующего подхода:
- цикл через каждый элемент в 40mb xml-файле
- назначить элемент строковой переменной
- Добавьте строковую переменную к объекту
Collection
В итоге вы получаете набор строк, представляющих ваш XML. Затем, когда вам нужно найти его, вы просто делаете
For Each
через вашу коллекцию строк и делаете ваши сравнения по одному элементу за раз.