string - una - grep buscar palabra exacta
¿Cómo encuentro una cadena específica en uno de muchos archivos de texto.log usando VBA? (3)
Este es el código que tengo hasta ahora para encontrar todos los archivos de registro en una carpeta. Pero necesito ser capaz de encontrar una cadena específica en cada archivo, si se encuentra en un archivo, deje de buscar y salga del ciclo e informe en qué nombre de archivo estaba.
Parece que hay tantas formas diferentes de abrir un archivo y buscarlo que no sé cuál es el mejor y normalmente no uso VBA, pero es todo a lo que tengo acceso en este momento.
En una nota lateral, habría un máximo de 36 archivos de registro y cada archivo máximo de 5 MB cada uno.
Sub StringExistsInFile()
Dim TheString As String
TheString = "MAGIC"
Dim StrFile As String
StrFile = Dir("c:/MyDownloads/*.log")
Do While Len(StrFile) > 0
''Find TheString in the file
''If found, debug.print and exit loop
Loop
End Sub
Encontré este código pero parece en 2007+ versiones de Excel VBA Application.FileSearch fue eliminado:
Sub FindText()
''http://www.mrexcel.com/forum/excel-questions/68673-text-file-search-excel-visual-basic-applications.html
Dim i As Integer
''Search criteria
With Application.FileSearch
.LookIn = "c:/MyDownloads" ''path to look in
.FileType = msoFileTypeAllFiles
.SearchSubFolders = False
.TextOrProperty = "*MAGIC*" ''Word to find in this line
.Execute ''start search
''This loop will bring up a message box with the name of
''each file that meets the search criteria
For i = 1 To .FoundFiles.Count
MsgBox .FoundFiles(i)
Next i
End With
End Sub
Este código:
busca todas las extensiones de archivo
*.log
C:/MyDownloads/
abre cada archivo
*.log
y lee cada líneasi se encuentra
theString
MAGIC , imprime el nombre del archivo en elImmediate Widnow
( CTRL + G )
Sub StringExistsInFile()
Dim theString As String
Dim path As String
Dim StrFile As String
Dim fso As New FileSystemObject
Dim file As TextStream
Dim line As String
theString = "MAGIC"
path = "C:/MyDownloads/*.log"
StrFile = Dir(path & "*.log")
Do While StrFile <> ""
''Find TheString in the file
''If found, debug.print and exit loop
Set file = fso.OpenTextFile(path & StrFile)
Do While Not file.AtEndOfLine
line = file.ReadLine
If InStr(1, line, theString, vbTextCompare) > 0 Then
Debug.Print StrFile
Exit Do
End If
Loop
file.Close
Set file = Nothing
Set fso = Nothing
StrFile = Dir()
Loop
End Sub
Application.FileSearch
se eliminó en 2007+ versiones de Excel. Hace un tiempo, encontré esta función que lo replica. Lo he usado ocasionalmente, pero normalmente creo que solo uso FileSystemObject
o Dir
.
Sub FileSearch()
''
'' Example of FileSearchByHavrda procedure calling as replacement of missing FileSearch function in the newest MS Office VBA
'' 01.06.2009, Author: P. Havrda, Czech Republic
''
Dim sDir As String
sDir = Range("K3").Value
Dim FileNameWithPath As Variant
Dim ListOfFilenamesWithParh As New Collection '' create a collection of filenames
Dim rCount As Long ''row counter
'' Filling a collection of filenames (search Excel files including subdirectories)
Call FileSearchByHavrda(ListOfFilenamesWithParh, sDir, "*.xls", False)
'' Print list to immediate debug window and as a message window
For Each FileNameWithPath In ListOfFilenamesWithParh '' cycle for list(collection) processing
Debug.Print FileNameWithPath & Chr(13)
''MsgBox FileNameWithPath & Chr(13)
rCount = Application.WorksheetFunction.CountA(Range("A:A")) + 1
ActiveSheet.Cells(rCount, 1).Value = FileNameWithPath
Next FileNameWithPath
'' Print to immediate debug window and message if no file was found
If ListOfFilenamesWithParh.Count = 0 Then
Debug.Print "No file was found !"
MsgBox "No file was found !"
End If
End Sub
''//------------------------------------------------------------------------------------------------
Private Sub FileSearchByHavrda(pFoundFiles As Collection, pPath As String, pMask As String, pIncludeSubdirectories As Boolean)
''
'' Search files in Path and create FoundFiles list(collection) of file names(path included) accordant with Mask (search in subdirectories if enabled)
'' 01.06.2009, Author: P. Havrda, Czech Republic
''
Dim DirFile As String
Dim CollectionItem As Variant
Dim SubDirCollection As New Collection
'' Add backslash at the end of path if not present
pPath = Trim(pPath)
If Right(pPath, 1) <> "/" Then pPath = pPath & "/"
'' Searching files accordant with mask
DirFile = Dir(pPath & pMask)
Do While DirFile <> ""
pFoundFiles.Add pPath & DirFile ''add file name to list(collection)
DirFile = Dir '' next file
Loop
'' Procedure exiting if searching in subdirectories isn''t enabled
If Not pIncludeSubdirectories Then Exit Sub
'' Searching for subdirectories in path
DirFile = Dir(pPath & "*", vbDirectory)
Do While DirFile <> ""
'' Add subdirectory to local list(collection) of subdirectories in path
If DirFile <> "." And DirFile <> ".." Then If ((GetAttr(pPath & DirFile) And vbDirectory) = 16) Then SubDirCollection.Add pPath & DirFile
DirFile = Dir ''next file
Loop
'' Subdirectories list(collection) processing
For Each CollectionItem In SubDirCollection
Call FileSearchByHavrda(pFoundFiles, CStr(CollectionItem), pMask, pIncludeSubdirectories) '' Recursive procedure call
Next
End Sub
No fui a la segunda pregunta, pero en la primera pregunta, ¡algo tiene defectos! En la linea
path = "C: / MyDownloads / *. log"
no use la opción "* .log", la ruta debería ser solo "C: / MyDownloads /"