Страницы: 1
RSS
Как обработать строки из *.txt файла в режиме реального времени ?
 
уважаемые форумяне,хто-нить сталкивался с такой проблемкой:  
допустим win-приложение записывает построчно в текстовой файл,т.е. запись 1-й строки,  
пауза,запись 2-й строки, пауза ... и т.д.,а VBA-код запущен из книги excel:  
dir = "C:\textsample"  
Open dir + ".txt" For Input As #1  
 
Do  
Line Input #1, data  '--- считываем одну строчку из файла  
'----------  ----------------------------------------  
'  анализатор строк    
'----------  ----------------------------------------  
 
Loop Until EOF(1)'--- если конец файла-то выход из цикла---  
Close #1  
 
увы,такой код работает только на истории,т.е. сколько было первоначально записано строк  
столько он их и обработает,а новые стринги считывать не будет ,из-за условия EOF!  
первое,что мне пришло в голову-нужен какой-то обработчик события прихода в текстовой файл  
(со стороны win-приложения)новой строки,а дальше VBA-код смог бы сосчитать (и обработать)  
в книге excel этот свежий стринг,в принципе,в VBA-коде возможно такое сделать?
 
Если размер файлов txt небольшой, то операции чтения\записи происходят практически моментально. Я бы просто в цикле (к примеру, с интервалом в 1 секунду) считывал содержимое текстового файла, и проверял бы, не добавились ли в него новые строки. <BR>Функции для чтения и записи файлов TXT есть здесь: http://excelvba.ru/code/txt <BR>Можно и попытаться отслеживать изменения в файле - также в цикле отслеживать размер файла или дату его последнего изменения.
 
Да, функция EOF не обновляет значение, если длина файла увеличилась.  
Функция LOF обновляет, но если пытаться делать Line Input, когда EOF=True, то возникает ошибка.  
Поэтому приходится открывать файл в Binary mode и эмулировать Line Input.  
Попробуйте запустить макрос, потом открыть указанный файл в Блокноте и добавлять туда данные, периодически сохраняя его.  
Если в добавленном куске встретится перевод строки, макрос закончит формирование строки и вызовет подпрограмму обработки. Если LF или CR не встретится, макрос будет ждать до добавления следующего куска. То есть если внешняя программа пишет в файл отдельными байтами или кусками строки, процедура обработки будет вызываться только тогда, когда закончена запись строки.    
Можно сначала создать файл с содержимым и потом запустить макрос, неважно.  
 
Sub aa()  
Dim s$, b As Byte  
Open "c:\temp\1.txt" For Binary Access Read As #1  
Do  
Do While Loc(1) < LOF(1)  
   Get #1, , b  
   If b <> 10 And b <> 13 Then 'LF,CR  
       s = s & Chr$(b)  
   ElseIf s <> "" Then  
       ProcessString (s)  
       s = ""  
   End If  
   Loop  
DoEvents  
Loop  
End Sub  
 
Private Sub ProcessString(x$)  
' анализатор строк  
MsgBox x  
If x = "stop" Then End  
 
End Sub  
 
PS Цикл с DoEvents грузит процессор на 100%, но работе компа особо не мешает. Все это сообщение я написал при запущенном макросе :)
 
dr_gebbels !?  
Ну и ник у вас (нарочно с маленькой буквы). Если бы я сразу его опознал, постить бы не стал :((
 
Не вопрос - я здесь.
 
как вариант  
 
Sub ff()  
   Dim LastModified As Date  
   Dim fso As New FileSystemObject  
   Dim fi As File  
 
   Set fi = fso.GetFile("c:\1.txt")  
     
   Do  
       If fi.DateLastModified <> LastModified Then  
           LastModified = fi.DateLastModified  
           Debug.Print LastModified  
       End If  
       DoEvents  
   Loop  
End Sub
 
Jom, зачем же использовать FileSystemObject, да ещё и с ранним связыванием?  
 
Можно проще - в VBA есть для этого специальная функция FileDateTime:  
 
Sub test()  
   ПутькФайлу = "R:\Excel macros.txt"  
   Dim LastModified As Date, LastDate As Date  
 
   LastDate = FileDateTime(ПутькФайлу)  
   Do  
       If LastDate <> LastModified Then  
           LastModified = LastDate  
           Debug.Print LastModified  
           ' запуск макроса обработки файла  
       End If  
       DoEvents  
   Loop  
End Sub
 
{quote}{login=EducatedFool}{date=11.10.2010 11:20}{thema=}{post}Jom, зачем же использовать FileSystemObject, да ещё и с ранним связыванием?  
 
Можно проще - в VBA есть для этого специальная функция FileDateTime:  
 
 
Не спорю, конечно можно , просто я привык постоянно работать  с FileSystemObject и переключаться каждые раз на разные объекты в разных языках муторно.
 
благодарю за комменты,но вариант с DoEvents мне кажется будет тормозить комп-попытаюсь  
его проверить, самое простое-опрос через секунду,пробовал это:  
 
'__________________________________________________    
Sub Update()  
Range("B3").Value = Range("B3").Value + 1  '------анализатор строк---------  
NextTick = Now + TimeValue("00:00:01")  
Application.OnTime NextTick, "Update"  
End Sub  
'__________________________________________________    
 
здесь вместо Range("B3")...   нужно вставить процедуру обработки текст-файла с его    
открытием  Open dir + ".txt" For Input As #1 (в начале),  
и закрытием  Close #1(в конце),  
наверное,в процедурку придется добавить сиковую функцию Seek,чтобы при каждом повторе  
анализатора строк-начинать обработку не с самого начала,а с предыдущего значения Seek.
Страницы: 1
Читают тему
Наверх