VBA Самый быстрый способ поиска 40 МБ XML-файла или преобразования двоичного массива этого файла в строку для поиска - PullRequest
3 голосов
/ 23 марта 2011

Хауди, У меня VBA работает за MS Access. Мне нужно многократно искать и извлекать данные из файла 40 МБ. Слишком большой для загрузки в строковую переменную. Я загрузил его в двоичный массив (скорее zippily, я мог бы добавить), но я не знаю, как использовать этот формат ..... Я не могу понять цикл через массив байт за раз в поисках строки ...... Так что я отбросил эту идею ... (но я хочу научиться использовать эту стратегию) ... Я приступил к поиску на основе FilesystemObject; вот что у меня так далеко:

Я получаю начало (x) и конец (y) узла и затем помещаю его в переменную FLat.

 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 ]

4 голосов
/ 24 марта 2011

Я вижу, что вы ищете ловкость, поэтому я советую загрузить ваш 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 голос
/ 23 марта 2011

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

  1. Цикл каждого элемента в 40 МБ XML-файле
  2. Присвоить элемент строковой переменной
  3. Добавить строковую переменную к Collection объекту

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...