用于计算文本文件中行数的函数

时间:2011-09-14 12:46:38

标签: 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 = 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 个答案:

答案 0 :(得分:18)

如果有人还在寻找更快的方法,请输入以下代码:

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倍。

答案 1 :(得分:7)

我看到的唯一选择是逐行读取行(编辑:或者只是逐个跳过它们)而不是一次读取整个文件。不幸的是我无法测试哪个更快。我想跳绳更快。

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 :(得分:7)

文件太大...
以下是我所知道的最有效的方法:

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

答案 3 :(得分: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"

答案 4 :(得分:-1)

    Label statusLabel = new Label(parent, SWT.NONE);
    Text searchText = new Text(parent, SWT.SEARCH);
    searchText.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetDefaultSelected(SelectionEvent e) {
            // change label
            statusLabel.setText("searching...");

            // HERE force client update

            // start searching
            Display.getCurrent().asyncExec(new Runnable() {
                @Override
                public void run() {
                    // do actual search
                }
            });
        }
    });

如果它添加一个空的最后一行,结果为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

它适用于txt文件中的一列。

答案 5 :(得分:-1)

我一直在寻找比确定文本文件中的行数更快的方法。我搜索了互联网并遇到了2个有希望的解决方案。一个是基于SQL的解决方案,另一个我在这里找到的基于Ful by Kul-Tigin的解决方案。我测试了它们,这是结果的一部分:

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 / text文件中行数的最快方法的人来说,这里是我使用的代码。

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 :(得分:-1)

如何计算记事本中的所有行 答案: =>下面是代码-

git mv foldername tempname && git mv tempname folderName