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 3

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. Все остальное, и вы действительно делаете свою собственную жизнь несчастной по сравнению с этим.

Как насчет следующего подхода:

  1. цикл через каждый элемент в 40mb xml-файле
  2. назначить элемент строковой переменной
  3. Добавьте строковую переменную к объекту Collection

В итоге вы получаете набор строк, представляющих ваш XML. Затем, когда вам нужно найти его, вы просто делаете For Each через вашу коллекцию строк и делаете ваши сравнения по одному элементу за раз.