powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прочитать строку из файла
15 сообщений из 15, страница 1 из 1
Прочитать строку из файла
    #34569892
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поскажите, как на vbscript сделать такое.
Из лог-файла вида

Код: plaintext
1.
"F:\Data"  0   31 . 05 . 2007   22 : 08 
"F:\Data"  1   31 . 05 . 2007   23 : 10 
нужно прочитать последнюю строку и загнать дату и время в переменную.
Все усложняется тем, что строки будут постоянно дописываться в конец и может быть различная длина

Код: plaintext
"F:\Backup"  2   31 . 05 . 2007   3 : 50 

Можно ли как-то сделать такое?
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34569921
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В принцепе лог можно и так записать
Код: plaintext
1.
2.
 0   31 . 05 . 2007   3 : 50  "F:\Backup"
 1   31 . 05 . 2007   23 : 10  "F:\Data"

Но не понятно, как выхватить время и дату. В одном случае слева 17 символов, в другом 18.
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34569928
lena_####
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Sub s()
  Dim v_Str As String, v_Date As Date, v_Time As Date
  
  v_Str = """F:\Data"" 0 31.05.2007 22:08"
  
  v_Date = CDate(Split(Trim(v_Str))( 2 ))
  v_Time = CDate(Split(Trim(v_Str))( 3 ))
  
  Debug.Print v_Date; Tab; v_Time
End Sub
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34569942
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как найти последнюю строку?
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34570039
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lena_####, ваш пример мне не понятен.

Посмотрите, плиз, что я тут наваял:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim arrFileLines()
i =  0 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("f:\test\bak.log",  1 )
Do Until objFile.AtEndOfStream
 Redim Preserve arrFileLines(i)
 arrFileLines(i) = objFile.ReadLine
 i = i +  1 
Loop
objFile.Close
l = UBound(arrFileLines)
 'Wscript.Echo arrFileLines(l)
LastLine = arrFileLines(l)
r_time = right(LastLine, len(LastLine)-instrrev(LastLine," "))
r_date = Left((Right(LastLine, len(r_time)+ 11 )),  10 )
'my = right(LastLine,
Wscript.Echo r_date & "," & r_time

Из лога в формате:
Код: plaintext
1.
2.
3.
"F:\Data"  0   31 . 05 . 2007   22 : 08 
"F:\Data"  1   31 . 05 . 2007   23 : 10 
"F:\Backup"  2   31 . 05 . 2007   3 : 50 

получаю из последней строки:
Код: plaintext
1.
 31 . 05 . 2007 , 3 : 50 

Но есть сомнения в оптимальности такого кода. Не будет ли где ошибок?
Спецы, проверьте, плиз.
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34570071
lena_####
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам нужна последняя строка в логе. Зачем тогда заводить массив строк, переопределять его размерность после чтения очередной строки, находить его верхнюю границу, чтобы потом извлечь из него последнюю строку. Мне кажется, можно сделать проще:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objFile = objFSO.OpenTextFile("D:\_FILES\_My\_Temp\bak.log",  1 )
  Do Until objFile.AtEndOfStream
    LastLine = objFile.ReadLine
  Loop
  objFile.Close
  'Wscript.Echo arrFileLines(l)
  r_time = Right(LastLine, Len(LastLine) - InStrRev(LastLine, " "))
  r_date = Left((Right(LastLine, Len(r_time) +  11 )),  10 )
  'Wscript.Echo r_date & "," & r_time

Что касается способа распарсить строку лога – если Вы уверены в том, что формат ее не будет меняться и Вам не пришелся мой способ – юзайте свой.
Только имейте ввиду, что, например, для строки
Код: plaintext
"F:\Data"  40   1 . 2 . 2007   1 : 30 
Ваш способ вернет:
Код: plaintext
 0   1 . 2 . 2007 , 1 : 30 
а вот такой способ:
Код: plaintext
1.
  r_date = Split(LastLine)( 2 )
  r_time = Split(LastLine)( 3 ) 
вернет:
Код: plaintext
 1 . 2 . 2007 , 1 : 30 
А вообще, мне кажется, наибольшую гибкость даст использование регулярных выражений.
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34570551
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если в логе будет что-то типа
Код: plaintext
"C:\Documents and Settings\Folder"  5   31 . 05 . 2007   22 : 08 
split не получится применить?
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34570601
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все получится если немного подумать.
Первый Split по знаку " разобьет твою строку на путь к файлу и "все остальное"
Второй Split распарсит "все остальное" на нужные тебе данные.
И для универсальности я думаю лог лучше писать как ты уже предлагал

0 31.05.2007 3:50 "F:\Backup"

думаю в этом случае распарсить строку будет проще :)
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34570605
lena_####
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну типа так:
Код: plaintext
1.
r_date = Split(Split(LastLine, Chr( 34 ))( 2 ))( 2 )
r_time = Split(Split(LastLine, Chr( 34 ))( 2 ))( 3 )
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34570877
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Усложним задачу. Нужно найти первую строку с конца лога, где номер дампа (то число что перед датой и временем) меньше 3 (например). И распарсить ее.
Вот что получилось у меня:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set logfile = objFSO.OpenTextFile("f:\test\bak.log",  1 )

Dim Param
strDumpNum = "3"

Sub FindLine(log_file)
Dim arrFileLines()
i =  0 
Do Until log_file.AtEndOfStream
 Redim Preserve arrFileLines(i)
 arrFileLines(i) = Log_file.ReadLine
 i = i +  1 
Loop
logfile.Close
For l = Ubound(arrFileLines) to LBound(arrFileLines) Step - 1 
 If Split(Split(arrFileLines(l), Chr( 34 ))( 2 ))( 1 ) < strDumpNum Then
  r_date = Split(Split(arrFileLines(l), Chr( 34 ))( 2 ))( 2 )
  r_time = Split(Split(arrFileLines(l), Chr( 34 ))( 2 ))( 3 )
  Param = r_date & "," & r_time
 Exit Sub
 End if
Next
End Sub

FindLine logfile
Wscript.Echo Param

Формат пока не менял:
Код: plaintext
1.
2.
3.
"F:\Data"  1   31 . 05 . 2008   22 : 10 
"F:\Data"  0   31 . 05 . 2007   22 : 12 
"F:\Data"  1   31 . 05 . 2007   23 : 10 
"f:\data"  5   31 . 05 . 2007   23 : 15 

получаем:
Код: plaintext
 31 . 05 . 2007 , 23 : 10 

Вроде работает, но может где-то упростить или ошибки есть неявные? Гляньте, плиз.
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34588825
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно проверить есть записи в логе или нет?
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34588836
Фотография gjghjc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну например проверить размер файла при помощи FileLen(путь к файлу)
или считать первую строку если Len (строка) = 0 то файл скорее всего пустой.
(если конечно ты при записи не зашарашишь первой строкой в файл нулевую :) )
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34588837
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wild-catВроде работает, но может где-то упростить или ошибки есть неявные? Гляньте, плиз.Тебе ж уже говорили - если нужна только последняя строка, то и массив заводить нафиг не нужно.
Код: plaintext
1.
2.
3.
4.
5.
6.
Do Until log_file.AtEndOfStream
   LineToCheck = objFile.ReadLine
   If Split(Split(LineToCheck, Chr( 34 ))( 2 ))( 1 ) < strDumpNum Then
      LastLine = LineToCheck
   End If
Loop
WScript.Echo LastLine
Все
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34588869
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wild-catПоскажите, как на vbscript сделать такое.
Из лог-файла вида

Код: plaintext
1.
"F:\Data"  0   31 . 05 . 2007   22 : 08 
"F:\Data"  1   31 . 05 . 2007   23 : 10 
нужно прочитать последнюю строку и загнать дату и время в переменную.
Все усложняется тем, что строки будут постоянно дописываться в конец и может быть различная длина

Код: plaintext
"F:\Backup"  2   31 . 05 . 2007   3 : 50 

Можно ли как-то сделать такое?

wild-cat,

Совсем не обязательно организовывать цикл для прочтения последней строки флайла. Для лог файла очень часто достаточно сделать следующее для прочтения его последней строки:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
   Dim objFso As New FileSystemObject
    Dim objTtxStrm As TextStream
    Dim myArr() As String
     
    Set objTtxStrm = objFso.OpenTextFile("C:\Temp\FDE0619A.dat", ForReading, False, TristateUseDefault)
    
    myArr = Split(objTtxStrm.ReadAll, vbCrLf, , vbBinaryCompare)
    
    MsgBox myArr(UBound(myArr))
    
    objTtxStrm.Close


Как видите, цикл не нужен. Здесь подразумевается, что каждая строка добавлялась в файл с помощью возврата каретки (Cr) и Line Feed (Lf). Но может оказаться достаточно vbCR. Даже "большие" лог файлы "проглатываются" методом ReadAll.

Остальное вам показали другие.

Успехов.
...
Рейтинг: 0 / 0
Прочитать строку из файла
    #34588919
wild-cat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасиб, друзья! Туплю чего-то я..
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Прочитать строку из файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]