Search code examples
vbatext-files

ReadAll() Method from FSO doesn't complete text file


I'm trying to read a text file at once, into a string, to search for a value that I know that exists inside. I'm using the FSO Method (ReadAll()), but the Instr() function doesn't find that value. I think he is importing just a part of the file.

Sub read_File_At_once_FSO()

On Error Resume Next
Dim objFileSystemObject As Object
Dim strFileContent As String
Dim RowsInFile  As Long
'Dim ColsInFile  As Long
Dim FileSize    As Long 'in bytes
Dim InStrPos    As Long
Dim strFullPath As String


    strFullPath = "G:\Fusao de Clientes\PRD\IMP_ID1056001_J.TXT"
    
    ' Use late binding throughout this method to avoid having to set any references.
    Set objFileSystemObject = CreateObject("Scripting.FileSystemObject")
    strFileContent = objFileSystemObject.OpenTextFile(strFullPath).readall()
    
    
        
                ' We have a matched string.
                InStrPos = InStr(1, strFileContent, "0005790306", vbTextCompare)
    
                If InStrPos > 0 Then
                    
                    'get FileLen
                    FileSize = FileLen(strFullPath)
                    
                    'Get the number of lines inside the file
                    With CreateObject("vbscript.regexp")
                        .Global = True
                        '.Pattern = "\b" & varStrings(lngIndex) & "\b"     'By using word boundary (\b), you can specify in the regex pattern that you are searching for complete word(s).        '"\r\n"       '  or .Pattern = "\n"
                        .Pattern = "\r\n" 'vbCrLf               '.Pattern = "\n" ' vbLf, Unix style line-endings
                        RowsInFile = .Execute(strFileContent).Count + 1
                    End With
                    
                    
                    
                    
                End If
            
       
        Set objFileSystemObject = Nothing
On Error GoTo 0


End Sub

I dont know how to atach the file for you to test it.

When I try to read with the code below, I'm geting the 'Run Time Error 62 : Imput past end of file'.

Function read_File_At_once()

Dim strFilename As String: strFilename = "G:\Fusao de Clientes\PRD\IMP_ID1056001_J.TXT"
Dim strFileContent As String
Dim iFile As Integer: iFile = FreeFile
Open strFilename For Input As #iFile
strFileContent = Input(LOF(iFile), iFile)

    'Get the number of lines inside the file
    With CreateObject("vbscript.regexp")
        .Global = True
        '.Pattern = "\b" & varStrings(lngIndex) & "\b"     'By using word boundary (\b), you can specify in the regex pattern that you are searching for complete word(s).        '"\r\n"       '  or .Pattern = "\n"
        .Pattern = "\r\n" 'vbCrLf               '.Pattern = "\n" ' vbLf, Unix style line-endings
        RowsInFile = .Execute(strFileContent).Count + 1
    End With


Close #iFile
End Function

Can anyone help please?


Solution

  • Your file is UTF-8, which FSO is not good at reading. You can use something like the function below, and it will read the entire file correctly:

    Function ReadUTF8(filePath As String) As String
        With CreateObject("ADODB.Stream")
            .Charset = "utf-8"
            .Open
            .LoadFromFile filePath
            ReadUTF8 = .ReadText()
            .Close
        End With
    End Function
    

    EDIT - apparently the FSO Read() method can work in place of ReadAll()

    Function FsoReadAll(filePath As String) As String
        With CreateObject("Scripting.FileSystemObject")
            FsoReadAll = .OpenTextFile(filePath, 1).read(.getFile(filePath).Size)
        End With
    End Function
    

    From: https://stackoverflow.com/a/56434461/478884