我想在VBA中读取一个大文件,并在网上看到以下代码:
Dim MyChar As String, Pointer As Long, LastLine As String
Open "MyTextFile.Txt" For Binary As #1
Pointer = LOF(1) - 2
MyChar = Chr$(32)
Do
Get #1, Pointer, MyChar
If MyChar = vbCr Or MyChar = vbLf Then
Exit Do
Else: Pointer = Pointer - 1
LastLine = MyChar & LastLine
End If
Loop
MsgBox "Last Line is " & LastLine
我如何改变这段代码以获得倒数第二行?需要一些帮助。
想到这一点:
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
"MyTextFile.Txt", 1)
objTextFile.ReadAll
MsgBox objTextFile.Line
但我到不了2号线。
4条答案
按热度按时间trnvg8h31#
您提供的代码工作方式如下:
1.它设置指向文件最后一个字符的指针
1.然后,它向后读取该文件,直到找到换行符
1.它返回最后一行读取的所有内容。
为了根据您的需要进行修改,我添加了一个
Boolean secondRun
,它让代码再次运行步骤2,从而记录倒数第二行:pwuypxnk2#
这取决于你的方法。但是如果文件真的那么大,你可能不希望Excel加载整个文件。所以,你可能会在不知道文件有多大和有多少行的情况下打开文件并逐行读取。在这种情况下,最简单的方法可能是一次在两个独立的字符串变量中存储两行。一旦你到达最后一行,你就可以退出循环。如上面的代码所示-并且不仅输出最后一行(正如代码中已经完成的那样),还输出该文件倒数第二行的内容。
另一种方法是首先查询文件的行数,然后使用ADO获取该文件中倒数第二条记录。但我怀疑这是否会更快。ADO的问题是,您会得到一个包含整个文本文件的巨大的
recordset
返回。这是由于在子句SELECT * from MyTextFile.txt
中没有where限制。因此,整个文本文件会在之前进入内存。然后--当然--您可以检查RecordCount
,并再次使用光标快进浏览所有记录,直到您碰到倒数第二行。不幸的是,ADO不支持行编号()超过(按@@行计数排序)。
否则,您可以先使用
select count(1) from MyTextFile.txt
获取行计数,然后只获取适用的行。所以,在任何情况下,我几乎可以肯定(没有测试过)ADO的性能会低于标准,如果文本文件像你说的那么大,第一个解决方案是要走的路。如果你仍然喜欢ADO,那么这是它的代码(基于下面的SO问题/答案:Copying text from .txt file in Excel using ADO ignores first row)。
kq0g1dla3#
你可以试试这个:
如有必要,可以更改行分隔符(例如,vbLF的vbCR)
xnifntxz4#
“符合要求”版本
改进了 Verzweifler 的回答,恕我直言:
LF
,而不能使用CR LF
)扩展版本
lineCount