从文本文件中searchstring&使用VBA返回行号

我有一个包含大约100K行的文本文件。 现在我想从文本文件中search一个string。 如果该string存在,那么我想要得到它所在的行号。 最后,我需要从文本文件中的行号出现所有的string。

*普通方法尝试*我们可以逐行阅读整个文本文件。 保持一个计数器variables,在每次读取后增加。 如果我find了我的string,那么我将返回计数器variables。 这种方法的局限性在于,我必须遍历所有的100K行来searchstring。 这会降低性能。

*快速方法(需要帮助)*是否有任何方式,将直接带我到我的searchstring存在的行,如果find我可以返回行号在它的存在。

*例子*

考虑以下数据存在于文本文件中。 (说只有5行是目前)

在这里输入图像说明

现在我想search一个string说“浦那”。 现在search后,它应该返回我行号string“pune”存在。 在这种情况下,它出现在第2行。我应该得到“2”作为输出。 我想用他们的行号search所有“pune”的出现

下面的片段可以像下面这样重新整理:

Dim arr() As String Dim i As Long i = 0 If oFSO.FileExists(filePath) Then On Error GoTo Err Set oFS = oFSO.OpenTextFile(filePath) Do While Not oFS.AtEndOfStream ReDim Preserve arr(0 To i) arr(i) = oFS.ReadLine 'to save line's content to array 'If Len(oFSfile.ReadLine) = 0 Then Exit Do 'to get number of lines only i = i + 1 Loop oFS.Close Else MsgBox "The file path is invalid.", vbCritical, vbNullString Exit Sub End If 

我使用了一个关于如何查找一个string的〜10,000个文件列表的代码示例。 另外,因为我的html文件有可能包含在几行的string,我想要一个交错的输出,我改了一下,并添加了单元格插入片。 我只是在学习,但是这正是我所需要的,我希望它能帮助别人。

 Public Sub ReadTxtFile() Dim start As Date start = Now Dim oFSO As Object Set oFSO = CreateObject("Scripting.FileSystemObject") Dim oFS As Object Dim filePath As String Dim a, b, c, d, e As Integer a = 2 b = 2 c = 3 d = 2 e = 1 Dim arr() As String Do While Cells(d, e) <> vbNullString filePath = Cells(d, e) ReDim arr(5000) As String Dim i As Long i = 0 If oFSO.FileExists(filePath) Then On Error GoTo Err Set oFS = oFSO.OpenTextFile(filePath) Do While Not oFS.AtEndOfStream arr(i) = oFS.ReadLine i = i + 1 Loop oFS.Close Else MsgBox "The file path is invalid.", vbCritical, vbNullString Exit Sub End If For i = LBound(arr) To UBound(arr) If InStr(1, arr(i), "Clipboard", vbTextCompare) Then Debug.Print i + 1, arr(i) Cells(a + 1, b - 1).Select Selection.Insert Shift:=xlDown Cells(a, b).Value = i + 1 Cells(a, c).Value = arr(i) a = a + 1 d = d + 1 End If Next a = a + 1 d = d + 1 Loop Debug.Print DateDiff("s", start, Now) Exit Sub Err: MsgBox "Error while reading the file.", vbCritical, vbNullString oFS.Close Exit Sub End Sub 

这是另一种应该相当快速的方法。 它使用shell来执行FINDSTR命令。 如果您发现cmd框闪烁,请执行Internetsearch以禁用它。 有两个选项提供:一个将返回行号后跟一个冒号和包含关键字的行的文本。 另一个只是返回行号。

不知道你想要做什么的结果,所以我只是把它们放在一个消息框中。


 Option Explicit 'Set reference to Windows Script Host Object Model Sub FindStrings() Const FindStr As String = "Pune" Const FN As String = "C:\users\ron\desktop\LineNumTest.txt" Dim WSH As WshShell Dim StdOut As Object Dim S As String Set WSH = New WshShell Set StdOut = WSH.Exec("cmd /c findstr /N " & FindStr & Space(1) & FN).StdOut Do Until StdOut.AtEndOfStream S = S & vbCrLf & StdOut.ReadLine 'If you want ONLY the line number, then 'S = S & vbCrLf & Split(StdOut.ReadLine, ":")(0) Loop S = Mid(S, 2) MsgBox (S) End Sub