Здравствуйте.
Сразу прощу прощения за глупые вопросы, но я не программист, просто иногда приходится писать небольшие программки на VBA, Exel.
Задача: Есть текстовый файл, размером 500 кб. В нем содержится произвольный текст, в котором разбросаны текстовые "метки", длиной около 20 символов, количеством 1500 штук. Есть массив этих меток (берется из таблицы экселя).
Необходимо переписать в новый файл все куски исходного файла, которые содержат метки из массива, в таком порядке, в каком метки идут в массиве, этот порядок часто меняется.
Кусок - это последовательность строк файла не содержащая пустых строк - "абзац".
Задача упрощается тем, что все метки уникальны, встречаются в файле в одном экземпляре и тем, что метка может встретится только в первой строке "Абзаца".
C горем пополам и помощью знакомых удалось наваять программу:
For k = 1 To UBound(Z) ' Z - массив с текстовыми метками
Do While Not EOF(1)
Line Input #1, curStr ' #1 - исходный файл
If InStr(curStr, Z(k)) > 0 Then
Print #2, curStr ' запись метки в файл #2
Line Input #1, curStr
Do While Trim(curStr) <> "" ' копировать пока не встретится пустая строка
Print #2, curStr
If EOF(1) Then Exit Do
Line Input #1, curStr
Loop
Print #2, vbCrLf ' добавить в конец пустую строку
Exit Do ' каждая метка уникальна,поэтому искать ее еще раз не надо
End If
Loop
Seek 1, 1 ' переходим в начало файла
Next k
В кратце, чтобы не читать программу, алгоритм такой:
1. Метку из массива ищем в исходном файле, файл читаем с помощью Line input, если нашли, то вставляем строку с меткой в новый файл и все строки, следующие за ней, до пустой строки.
2. возвращяемся в начало файла и ищем вторую метку, и т. д., до конца массива с метками.
Проблема в том, что все это дело обрабатывается около 30 секунд. Т. к. размеры файла и кол-во меток быстро увеличивается, нужно ускорить программу.
Есть идея: перед обработкой файла занести в новый массив для каждой метки ее позицию в файле и не искать метки, а сразу переходить к позиции метки и производить необходимые операции.
Но у меня не получается это реализовать.
Похоже, что при считывании Line Input текущая позиция автоматически не увеличивается на длину строки.
Попытки увеличивать некоторую переменную на длину строки, получаемую с помощью Len к успеху не привели.
Буду очень благодарен, если вы сможете мне помочь в реализации этой идеи или подскажите
другой вариант программы, ускоряющий процесс.