重置File对象的索引以便多次读取

时间:2015-06-23 07:26:53

标签: excel vba excel-vba file-read

现在,我正在编写一个VBA程序。在我的程序中,首先我需要计算文件中的所有行。我需要行数,因为为文件中的行创建数组。所以,我使用了这段代码。没关系。

'Open file
Set file = fsObject.OpenTextFile(filePath, ForReading)

'Read all line
file.ReadAll

'Get line count
lineCount = file.line

'Close file
file.Close

获取行数后,我想从页面和页脚(空白行)中减去2。我不知道哪个词会是标题。我只知道它们是第一行和最后一行(空行)。

'Remove header and blank line from line count
lineCount = lineCount - 2

然后,我想逐行读取该文件,这对我来说只对我有用,并将所有行存储在数组中。问题在于,当逐行阅读时,需要重新打开文件。只有重新打开后,我才能逐行阅读。

因为,“ReadAll”方法被引遍所有行,file对象的索引显示为“AtEndOfFile”。所以,我必须重新打开它。请检查我的代码。

'If line count is greater than 0, read again file to get data
If lineCount > 0 Then

    'Re-define array size
    ReDim lineList(lineCount) As String

    'Here I opend it, I don't wanna open. I just want to set index of file object.
    'Re-open file
    Set file = fsObject.OpenTextFile(filePath, ForReading)

    'Read file until end
    Do Until file.AtEndOfStream

        'If current line is not first line(header) or last line(blank line)
        If line <> 0 And line <= lineCount Then

            'Store line into array
            lineList(index) = file.ReadLine

            'Increase array index
            index = index + 1

        Else

            file.ReadLine

        End If

        'Increase line index
        line = line + 1

    Loop

End If

但是,我想要另一种方式。我不想重新打开文件。我想将索引重置为file对象的第一行。所以,我不需要重新打开它。

我已经在网上搜索过了。但是,我没有找到任何建议。请帮我。感谢。

1 个答案:

答案 0 :(得分:0)

我的方法与您当前的方法略有不同,我会使用二进制读取来读取文件并将其保存在临时字符串中,然后使用Split函数将它们放入数组中。

这种方法有一个缺点,如果文件的长度(字符数)大于String变量的大小,那么我们可能会遇到问题,但除此之外。这是完全不同的方法。

Public Sub ReadFileData(filePath As String, Optional separatorStr As String = ";@;")
'******************************************************************************
'   Opens a large TXT File, reads the data until EOF on the Source,
'       then stores them in an Array
'   Arguments:
'   ``````````
'       1. The Source File Path - "C:\Users\SO\FileName.Txt" (or) D:\Data.txt
'       2. (Optional) Separator - The separator, you wish to use. Defauls to ';@;'
'*******************************************************************************
    Dim strIn As String, tmpStr As String, lineCtr As Long
    Dim tmpArr() As String

    Open filePath For Input As #1

    Do While Not EOF(1)
        'Read one line at a time.
        Line Input #1, strIn
        tmpStr = tmpStr & Trim(strIn) & separatorStr
        lineCtr = lineCtr + 1
    Loop
    Close #1

    tmpArr = Split(tmpStr, separatorStr)

    Debug.Print "Number of Elements in the Arrays is - " & UBound(tmpArr)
    Debug.Print "Number of Lines Read is - " & lineCtr
End Sub