Функция для подсчета количества строк в текстовом файле - PullRequest
12 голосов
/ 14 сентября 2011

Требуется функция, которая будет принимать имя файла в качестве параметра и затем возвращать количество строк в этом файле.

Должно потребоваться менее 30 секунд, чтобы получить счетчик файла в 10 миллионов строк.

В настоящее время есть что-то вроде - но это слишком медленно для больших файлов:

Dim objFSO, strTextFile, strData, arrLines, LineCount
CONST ForReading = 1

'name of the text file
strTextFile = "sample.txt"

'Create a File System Object
Set objFSO = CreateObject("Scripting.FileSystemObject")

'Open the text file - strData now contains the whole file
strData = objFSO.OpenTextFile(strTextFile,ForReading).ReadAll

'Split by lines, put into an array
arrLines = Split(strData,vbCrLf)

'Use UBound to count the lines
LineCount = UBound(arrLines) + 1

wscript.echo LineCount

'Cleanup
Set objFSO = Nothing

Ответы [ 7 ]

18 голосов
/ 21 февраля 2013

Если кто-то все еще ищет более быстрый путь, вот код:

Set fso = CreateObject("Scripting.FileSystemObject") 
Set theFile = fso.OpenTextFile("C:\textfile.txt", 8, True) 
WScript.Echo theFile.Line 
Set Fso = Nothing

Конечно, время обработки очень сильно зависит от размера файла, а не только от числа строк.По сравнению с методом RegEx свойство TextStream.Line как минимум в 3 раза быстрее.

7 голосов
/ 15 сентября 2011

Слишком большие файлы ...
Следующее - самый быстрый способ, который я знаю:

Dim oFso, oReg, sData, lCount
Const ForReading = 1, sPath = "C:\file.txt"
Set oReg = New RegExp
Set oFso = CreateObject("Scripting.FileSystemObject")
sData = oFso.OpenTextFile(sPath, ForReading).ReadAll
With oReg
    .Global = True
    .Pattern = "\r\n" 'vbCrLf
    '.Pattern = "\n" ' vbLf, Unix style line-endings
    lCount = .Execute(sData).Count + 1
End With
WScript.Echo lCount
Set oFso = Nothing
Set oReg = Nothing
7 голосов
/ 14 сентября 2011

Единственная альтернатива, которую я вижу, - это читать строки по одной (РЕДАКТИРОВАТЬ: или даже просто пропускать их по одной) вместо чтения всего файла сразу.К сожалению, я не могу проверить, что сейчас быстрее.Я думаю, что пропустить быстрее.

Dim objFSO, txsInput, strTemp, arrLines
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")

strTextFile = "sample.txt"
txsInput = objFSO.OpenTextFile(strTextFile, ForReading)

'Skip lines one by one 
Do While txsInput.AtEndOfStream <> True
    txsInput.SkipLine ' or strTemp = txsInput.ReadLine
Loop

wscript.echo txsInput.Line-1 ' Returns the number of lines

'Cleanup
Set objFSO = Nothing

Кстати, я позволил себе удалить некоторые из ваших 'comments.С точки зрения хорошей практики, они были излишни и не добавляли никакой объяснительной ценности, особенно когда они в основном повторяли имена методов, например

'Create a File System Object
... CreateObject("Scripting.FileSystemObject")
4 голосов
/ 14 сентября 2011

Вы можете попробовать некоторые варианты на этом

cnt = 0
Set fso = CreateObject("Scripting.FileSystemObject")
Set theFile = fso.OpenTextFile(filespec, ForReading, False)
Do While theFile.AtEndOfStream <> True
   theFile.SkipLine
   c = c + 1
Loop
theFile.Close
WScript.Echo c,"lines"
0 голосов
/ 08 февраля 2019

Как подсчитать все строки в блокноте Ответы: => Ниже код -

Set t1=createObject("Scripting.FileSystemObject")
Set t2=t1.openTextFile ("C:\temp\temp1\temp2_VBSCode.txt",1)
Do Until t2.AtEndOfStream
strlinenumber = t2.Line
strLine = t2.Readline
Loop
msgbox strlinenumber
t2.Close
0 голосов
/ 18 мая 2018

Я искал более быстрый способ, чем тот, который у меня уже был, чтобы определить количество строк в текстовом файле. Я искал в интернете и наткнулся на 2 многообещающих решения. Одним из них было решение на основе SQL, а другим - решение, которое я нашел здесь на основе Fso от Кул-Тигина. Я проверил их, и это часть результата:

Number of lines  Time elapsed  Variant
--------------------------------------------------------
110              00:00:00.70   SQL
110              00:00:00.00   Vanilla VBA (my solution)
110              00:00:00.16   FSO    
--------------------------------------------------------
1445014          00:00:17.25   SQL
1445014          00:00:09.19   Vanilla VBA (my solution)
1445014          00:00:17.73   FSO

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

Public Function GetNumRecs(ASCFile As String) As Long
  Dim InStream As Long
  Dim Record As String
  InStream = FreeFile
  GetNumRecs = 0
  Open ASCFile For Input As #InStream
  Do While Not EOF(InStream)
    Line Input #InStream, Record
    GetNumRecs = GetNumRecs + 1
  Loop
  Close #InStream
End Function
0 голосов
/ 21 июня 2017
txt = "c:\YourTxtFile.txt"
j = 0
Dim read
Open txt For Input As #1
  Do While Not EOF(1)
    Input #1, read
    j = j + 1
  Loop
Close #1

Если добавить пустую последнюю строку, результат будет (j - 1).

Отлично работает для одного столбца в текстовом файле.

...