Scripting 函数计算文本文件中的行数

Scripting 函数计算文本文件中的行数,scripting,vbscript,Scripting,Vbscript,需要一个函数,该函数将接受文件名作为参数,然后返回该文件中的行数 应在30秒内获得1000万行文件的计数 目前有一些类似的东西-但是对于大文件来说太慢了: Dim objFSO, strTextFile, strData, arrLines, LineCount CONST ForReading = 1 'name of the text file strTextFile = "sample.txt" 'Create a File System Object Set objFSO = Cre

需要一个函数,该函数将接受文件名作为参数,然后返回该文件中的行数

应在30秒内获得1000万行文件的计数

目前有一些类似的东西-但是对于大文件来说太慢了:

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

我看到的唯一替代方法是一行一行地读取(编辑:甚至是一行一行地跳过),而不是一次读取整个文件。不幸的是,我现在无法测试哪个更快。我想跳绳更快

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

你可以试试这个

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"
cnt=0
设置fso=CreateObject(“Scripting.FileSystemObject”)
Set theFile=fso.OpenTextFile(filespec,ForReading,False)
当file.AtEndOfStream为True时执行此操作
斯基普林文件
c=c+1
环
文件。关闭
Echo c,“行”
文件太大…
以下是我所知道的最快捷有效的方法:

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

如果有人仍在寻找更快的方法,下面是代码:

Set fso = CreateObject("Scripting.FileSystemObject") 
Set theFile = fso.OpenTextFile("C:\textfile.txt", 8, True) 
WScript.Echo theFile.Line 
Set Fso = Nothing
当然,处理时间在很大程度上取决于文件大小,而不仅仅是行数。与正则表达式方法相比,TextStream.Line属性至少快3倍

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文件中的一列。

我正在寻找一种比我已经确定文本文件中行数更快的方法。我在网上搜索了一下,发现了两个很有希望的解决方案。一个是基于SQL的解决方案,另一个是我在这里找到的基于Kul Tigin的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
如何计算记事本中的所有行数 答案: =>下面是代码-

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

+1我正要自己发布这篇文章,发现它的速度是原来的两倍(5秒内有1000000行)。作为优化,您可以使循环中唯一的事情
filInput.ReadLine
,然后当它完成时
filInput.Line-1
将是行数(因此您避免使用计数器和缓冲区变量)很好!将相应地进行编辑。事实上,我甚至不需要看台词。我可以跳过它!谢谢顺便说一句,我很惊讶你不是发布整洁的Regexp解决方案的人@图普:库尔·蒂金的回答(据说)比我的快;如果你能证实这一点,那么也许你应该接受他的回答!只是出于侠义…@Jean所有的答案都可以接受,不管哪个答案被接受。在我看来你已经是骑士了:)有人为自己选择了最合适的。+1很好,我在等待有人发布RegExp解决方案。你说它更快。。。你测试过这个吗?是的,我测试过一个大文件样本<代码>增强的代码持续28秒,您的代码持续22秒。对于正则表达式,它只持续8秒。你说的注释行中的注释是什么意思?UTF-8编码文件(与ISO-8859-1或其他编码文件一样)可以具有WIndows或Unix样式的行尾。没有关系。@mgr326639是的,我指的是Unix样式的行尾。谢谢你的更正。+1这绝对是解决这个问题的最佳技巧!谢谢您可能希望最后关闭该文件,并且“setofso=Nothing”应该是“setfso=Nothing”。我还要指出,8表示“用于追加”,这就是为什么它会立即读取到文件的末尾。此外,我会将最后一个参数设置为False,这样,如果文件不存在,就不会创建该文件,而是允许它出错。并使用file.Line-1返回文件中存在的行数,因为file.Line返回您将要写入但尚不存在的行号。我正在查找的内容。非常感谢。嗯。。。这段代码和一年前发布在这里的代码不一样吗?语言错误(VBA,不是VBScript);错误的策略(增加计数器而不是访问对象的属性)。@Ekkehard.Horner要详细说明吗?乍一看,这在我看来是合法的。这不是VBScript,如果存在.Line属性,则增加计数器是不对的。请查看以了解为什么您的解决方案不好。
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