Функция для подсчета количества строк в текстовом файле
Нужна функция, которая будет принимать имя файла как параметр, а затем возвращает количество строк в этом файле.
Должно быть занято менее 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
Ответы
Ответ 1
Единственная альтернатива, которую я вижу, - это прочитать строки один за другим (EDIT: или даже просто пропустить их один за другим), а не сразу читать весь файл. К сожалению, я не могу проверить, что быстрее. Я предполагаю, что проскальзывать быстрее.
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")
Ответ 2
Если кто-то все еще ищет более быстрый способ, вот код:
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 раза быстрее.
Ответ 3
Слишком большие файлы...
Ниже приводится наиболее быстрый способ, с помощью которого я знаю:
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
Ответ 4
Вы можете попробовать некоторые варианты этого
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"
Ответ 5
Я искал более быстрый способ, чем то, что мне уже приходилось определять количество строк в текстовом файле. Я обыскал интернет и нашел многообещающее решение. Одним из них было решение, основанное на 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
Ответ 6
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)
.
Он отлично работает для одного столбца в txt файле.