Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

бЫСТРЫЙ пОИСК в фАЙЛЕ

459
05 мая 2004 года
gacol
273 / / 12.02.2003
Вроде когда-то эта тема уже рассматривалась на форуме, но найти по поиску не смог.
Надо найти вложение в файле (двоичном). Файл большой и простым перебором байт получается долговато. Хотелось бы, чтобы как поиск в промоторщиках - раз и готово. Возможно поможет API-функция?
Помогите кто, чем может.
:o
2.0K
05 мая 2004 года
TimON
26 / / 17.02.2003
Цитата:
Originally posted by gacol
Вроде когда-то эта тема уже рассматривалась на форуме, но найти по поиску не смог.
Надо найти вложение в файле (двоичном). Файл большой и простым перебором байт получается долговато. Хотелось бы, чтобы как поиск в промоторщиках - раз и готово. Возможно поможет API-функция?
Помогите кто, чем может.
:o



Как мне кажется поисковики быстро работают, потому что у них есть база на определённые слова, из которой и достаются быстро ссылки, по существу твоё слово и есть ссылка на, скажем так, ячейку в базе. А быстро находить из файла тебе просто функции не помогут. Ищи другие пути решений.

Если я в чём-то не прав, не вините строго.

459
06 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by TimON


Как мне кажется поисковики быстро работают, потому что у них есть база на определённые слова, из которой и достаются быстро ссылки, по существу твоё слово и есть ссылка на, скажем так, ячейку в базе. А быстро находить из файла тебе просто функции не помогут. Ищи другие пути решений.

Если я в чём-то не прав, не вините строго.



У меня файл в принципе не текстовый, а бинарный. Сомневаюсь я, что в базе можно записать ссылки на его "слова".
Еще есть объект Application.FileSearch
у него есть свойство TextOrProperty, которое указывает на поиск файла с определенным содержанием. И это работает махом, а у меня перебором около минуты. Но определить позицию найденного вхождения не получается.

258
06 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by gacol
Вроде когда-то эта тема уже рассматривалась на форуме, но найти по поиску не смог.
Надо найти вложение в файле (двоичном). Файл большой и простым перебором байт получается долговато. Хотелось бы, чтобы как поиск в промоторщиках - раз и готово. Возможно поможет API-функция?
Помогите кто, чем может.
:o



А что за вложения? Какой опознавательный механизм.

Когда типы файлов подразумевают сложные вложения то их структуру разрабатывают как правило таким образом - в их заголовках размещают что-то типа оглавления, например тот же xls-файл построен по принципу FAT.

459
06 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV


А что за вложения? Какой опознавательный механизм.

Когда типы файлов подразумевают сложные вложения то их структуру разрабатывают как правило таким образом - в их заголовках размещают что-то типа оглавления, например тот же xls-файл построен по принципу FAT.



Ну вложение это просто я подразумевал ключевое слово - в моем конкретном случае название 3-х мерного массива "PRESSURE". Вообще файл создан специальной программой (кажется написана на FORTRANe) и вряд ли обычные поисковики будут настараиваться на его довольно произвольную структуру.

258
06 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by gacol


Ну вложение это просто я подразумевал ключевое слово - в моем конкретном случае название 3-х мерного массива "PRESSURE". Вообще файл создан специальной программой (кажется написана на FORTRANe) и вряд ли обычные поисковики будут настараиваться на его довольно произвольную структуру.



Ага, значит в бинарном файле надо найти слово/текст, правильно я тебя понял?

Если это так, то можно попробовать открывать его как текстовый - а кто нам мешает это сделать, ну и уже использовать все возможности по поиске текста в текстовых файлах.... надо посмотреть что нам могуть предложить встроенные VB средства

459
07 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV


Ага, значит в бинарном файле надо найти слово/текст, правильно я тебя понял?

Если это так, то можно попробовать открывать его как текстовый - а кто нам мешает это сделать, ну и уже использовать все возможности по поиске текста в текстовых файлах.... надо посмотреть что нам могуть предложить встроенные VB средства


Так я и поступал. Считывал 20Мб файл в строковую переменную и в ней искал InStr(). Все работает быстро, но отыскивается не первое вхождение а примерно двадцатое. Даже если я MID() вырезаю в нужном месте из этой переменной, то получается пустота. А то что находит InStr(), то работает нормально, но мне нужно первое вхождение.

258
07 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Вот, написал тестовой код, открываю на чтение файл winword.exe (OfficeXp), ищу кусок текста из конца 10 мб файла.

Код:
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Public Sub fff()
 
 Const ForReading = 1, ForWriting = 2, ForAppending = 3
 Dim fs, f
 Dim s As String
 Dim lTime As Long
 
    lTime = timeGetTime
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("c:\Winword.exe", ForReading, 0)
    Do
      s = f.ReadLine
      i = InStr(1, s, "E??xc", vbTextCompare)
      If i > 0 Then Exit Do
    Loop
    MsgBox timeGetTime - lTime
    f.Close
End Sub


Время поиска получается от 5099 в начале и 4166 на 4, 5 попытку (файл кешируется видно и уже побыстрее открывается системой). Помойму достаточно быстро ?!

P.S. токо я на свою седую башку не нашел как определить конец файла в FSO, так что кто знает пусть подскажет
459
07 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV
Вот, написал тестовой код, открываю на чтение файл winword.exe (OfficeXp), ищу кусок текста из конца 10 мб файла.

Код:
Public Declare Function timeGetTime Lib "winmm.dll" () As Long

Public Sub fff()
 
 Const ForReading = 1, ForWriting = 2, ForAppending = 3
 Dim fs, f
 Dim s As String
 Dim lTime As Long
 
    lTime = timeGetTime
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("c:\Winword.exe", ForReading, 0)
    Do
      s = f.ReadLine
      i = InStr(1, s, "E??xc", vbTextCompare)
      If i > 0 Then Exit Do
    Loop
    MsgBox timeGetTime - lTime
    f.Close
End Sub


Время поиска получается от 5099 в начале и 4166 на 4, 5 попытку (файл кешируется видно и уже побыстрее открывается системой). Помойму достаточно быстро ?!

P.S. токо я на свою седую башку не нашел как определить конец файла в FSO, так что кто знает пусть подскажет



Я примерно так и делал, считывал правда сразу весь файл
s = f.readall
Но при таком "текстовом" обращении позиция определяется неверно. Работает да - быстро!
:{

258
07 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by gacol


Я примерно так и делал, считывал правда сразу весь файл
s = f.readall
Но при таком "текстовом" обращении позиция определяется неверно. Работает да - быстро!
:{



Неверно?! ну да, не в байтах конечно, можно вести счетчик и узнать номер строки и кол-во симолов от начала строки. Эти данные пригодятся если извлекать данные текстом, хотя.... кто тебе мешает запихнуть все в строку, а потом эту строку уже рассматривать как Byte-массив? Тебе что потом после нахождения ключев. текста делать то надо? что и и в каком виде извлекать?

459
11 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV


Неверно?! ну да, не в байтах конечно, можно вести счетчик и узнать номер строки и кол-во симолов от начала строки. Эти данные пригодятся если извлекать данные текстом, хотя.... кто тебе мешает запихнуть все в строку, а потом эту строку уже рассматривать как Byte-массив? Тебе что потом после нахождения ключев. текста делать то надо? что и и в каком виде извлекать?



Я пробовал по-разному. И все в одну строку запихивал (readall) - пооиск дает не первое, а 20-е вхождение. и LineInput'ом - при этом позиция получается в 2 с лишним раза больше чем на самом деле (17Mb вместо 8Mb). Видимо содержимое файла чем то уникалено, но послать его такой большой для проверки сложновато.

459
11 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV


Неверно?! ну да, не в байтах конечно, можно вести счетчик и узнать номер строки и кол-во симолов от начала строки. Эти данные пригодятся если извлекать данные текстом, хотя.... кто тебе мешает запихнуть все в строку, а потом эту строку уже рассматривать как Byte-массив? Тебе что потом после нахождения ключев. текста делать то надо? что и и в каком виде извлекать?



Попробовал с winword.exe (из 2000 MSO).
Получается такая же ерунда. Вот мой пример

Set fs = CreateObject("Scripting.FileSystemObject")
fl = "C:\Program Files\Microsoft Office\Office\WINWORD.EXE"
Set a = fs.OpenTextFile(fl, 1, -2)
c$ = a.readall
i = InStr(1, c$, "ADVAPI32.dll")
a.Close

при этом позиция указывается i=7637041
а это позиция второго вхождения - можно проверить вручную в просмоторщике файлов. Первое вхождение в самом начале файла.

258
11 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by gacol


Попробовал с winword.exe (из 2000 MSO).
Получается такая же ерунда. Вот мой пример

Set fs = CreateObject("Scripting.FileSystemObject")
fl = "C:\Program Files\Microsoft Office\Office\WINWORD.EXE"
Set a = fs.OpenTextFile(fl, 1, -2)
c$ = a.readall
i = InStr(1, c$, "ADVAPI32.dll")
a.Close

при этом позиция указывается i=7637041
а это позиция второго вхождения - можно проверить вручную в просмоторщике файлов. Первое вхождение в самом начале файла.



Смотрю этот файл через просмотрощик Total Commander - Lister: режимы: только текст, кодировка ANSI.

Находит "ADVAPI32.dll" только один раз, ближе к концу файла.

459
12 мая 2004 года
gacol
273 / / 12.02.2003
Цитата:
Originally posted by SergeySV


Смотрю этот файл через просмотрощик Total Commander - Lister: режимы: только текст, кодировка ANSI.

Находит "ADVAPI32.dll" только один раз, ближе к концу файла.




Спасибо! С помощью объекта TextStream, который ты предлагал, выход нашелся.
Использую метод Read(1000000), т.е. считываю по 1Мб и тогда все видится точно и быстро. А ReadLine непонятно как позиционирует.
Размер файла нахожу с помощью Len(a.ReadAll).

А "ADVAPI32.dll" Far-просмоторщик находит два раза, в самом начале (745) и в конце, правда офисы у наз могут быть разными.

258
12 мая 2004 года
SergeySV
1.5K / / 19.03.2003
Цитата:
Originally posted by gacol



Спасибо! С помощью объекта TextStream, который ты предлагал, выход нашелся.
Использую метод Read(1000000), т.е. считываю по 1Мб и тогда все видится точно и быстро. А ReadLine непонятно как позиционирует.
Размер файла нахожу с помощью Len(a.ReadAll).

А "ADVAPI32.dll" Far-просмоторщик находит два раза, в самом начале (745) и в конце, правда офисы у наз могут быть разными.



Наверное, у меня там еще сервиспики стоят, так что надо рег. номера этих файлов для полной идентичности.

Я тоже предпочитаю кусками считывать, так работает более предсказуемо чем пытаться сразу запихнуть все в память.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог