2017-02-22 21 views
1

Мне нужно прочитать пятую последнюю строку из файла журнала через скрипт vb. Может кто-нибудь, пожалуйста, назовите меня, как это сделать?Прочитать 5-ю последнюю строку из текстового файла

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

Dim fh, fso, sLastLine, lineCount 

Set fso = CreateObject("Scripting.FileSystemObject") 
Set fh = fso.OpenTextFile("E:\Coding\VB\demo.txt") 
sLastLine = "" 
lineCount = 0 
Do Until fh.AtEndOfStream 
    lineCount = lineCount + 1 
    sLastLine = fh.ReadLine() 
Loop 
fh.Close 

WScript.Echo sLastLine 
WScript.Echo lineCount 

Содержимое для demo.txt выглядит следующим образом:

zcZcxZCsdfdfsfd 
aaaaa 
bbbb 
cccc 
dddd 
eeee 

В конце концов есть 4 пустых строк и я должен читать «ээээ» здесь.

+0

Чтение файла является распространенной практикой * (здесь много раз упоминается) *, дайте ему повод, и когда у вас возникнет конкретная проблема с возвратом вашего кода, и мы постараемся ответить на него. – Lankymart

ответ

2

Одно простое решение состоит в использовании System.Collections.Queue из .net framework. Он работает, он прост и не потребует огромного объема оперативной памяти, поскольку строки текста отбрасываются по мере их чтения, но для этого требуется установить .NET-инфраструктуру. Любая версия .net-инфраструктуры будет в порядке.

Option Explicit 

Const LastLinesCount = 5 

Dim DemoFile : Set DemoFile = CreateObject("Scripting.FileSystemObject").OpenTextFile("demo.txt") 
Dim Queue : Set Queue = CreateObject("System.Collections.Queue") 
Dim i 

Do While Not DemoFile.AtEndOfStream 
    Queue.Enqueue DemoFile.ReadLine 
    If Queue.Count > LastLinesCount then Queue.Dequeue 
Loop 

For i = 1 to LastLinesCount 
    WScript.echo Queue.Dequeue 
Next 

DemoFile.Close 
+0

Почему 'Close()' первый поток, когда вы могли просто установить '.Position = 0' и начать читать его снова? – Lankymart

+0

Поскольку объект TextStream, предоставленный FileSystemObject, не имеет свойства Position. –

+0

Вы абсолютно правы, думая об объекте 'ADODB.Stream'. – Lankymart

0

Похоже, вы можете обрезать конец и получить последнюю строку (не проверено):

Set fso = CreateObject("Scripting.FileSystemObject") 
Set fh = fso.OpenTextFile("E:\Coding\VB\demo.txt") 
text = Trim(fh.ReadAll()) 
i = InStrRev(text, vbLf) 
line = Mid(text, i + 1) 
0

Как насчет

Set fso = CreateObject("Scripting.FileSystemObject") 
Set fh = fso.OpenTextFile("D:\demo.txt") 
strin = Split(fh.readall, vbNewLine) 
wscript.echo strin(fh.Line - 5)