Scripting 函数计算文本文件中的行数
需要一个函数,该函数将接受文件名作为参数,然后返回该文件中的行数 应在30秒内获得1000万行文件的计数 目前有一些类似的东西-但是对于大文件来说太慢了: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
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